Я создаю приложение с флаттером и шаблоном провайдера. У меня есть конкретная модель ViewModel, которая предоставляется с Provider.of<AddressBookModel>(context)
.
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<AddressBookViewModel>(
builder:(_) => AddressBookViewModel(),
child: Scaffold(
body: _getBody(context);
}
Widget _getBody(BuildContext context) {
AddressBookViewModel vm = Provider.of<AddressBookViewModel>(context);
// AddressBookViewModel holds a list of contact objects
// (id, name, street, starred etc.)
List<Contact> contacts = vm.contacts;
return ListView.builder(
itemCount: contacts.length,
itemBuilder: (context, index) => ListTile(
title: Text(contacts[index].name),
trailing: contacts[index].starred
? Icon(Icons.star))
: null,
/**
* Changing one object rebuilds and redraws the whole list
*/
onLongPress: () => vm.toggleStarred(contacts[index]);
));
}
}
И соответствующая ViewModel
class AddressBookViewModel with ChangeNotifier {
final List<Contact> contacts;
AddressBookViewModel({this.contacts = []});
void toggleStarred(Contact contact) {
int index = contacts.indexOf(contact);
// the contact object is immutable
contacts[index] = contact.copy(starred: !contact.starred);
notifyListeners();
}
}
Проблема, с которой я столкнулся, заключается в том, что как только я меняю один контактный объект в списке на toggleStarred()
, провайдер перестраивает и перерисовывает весь список. На мой взгляд, в этом нет необходимости, поскольку необходимо перестроить только одну запись. Есть ли способ иметь поставщика, который отвечал бы только за один элемент списка? Или каким-то другим способом решить эту проблему?