gpt4 book ai didi

flutter - 允许提供者之间的区别

转载 作者:IT王子 更新时间:2023-10-29 07:10:56 24 4
gpt4 key购买 nike

我正在构建一个带有 flutter 和提供者模式的应用程序。我有一个特定的 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() 更改列表中的一个联系人对象。 ,提供商正在重建并重新绘制整个列表。这在我看来是没有必要的,因为只是一个条目需要重建。有没有办法让提供者只负责对于一个列表项?或者有什么其他方法可以解决这个问题?

最佳答案

使用列表时,您会希望为列表中的每个项目提供一个“提供程序”,并将列表项提取到一个常量中——尤其是当与您的项目关联的数据不可变时。

代替:

final contactController = Provider.of<ContactController>(context);
return ListView.builder(
itemCount: contactController.contacts.length,
builder: (_, index) {
reurn Text(contactController.contacts[index].name);
}
)

偏好:

final contactController = Provider.of<ContactController>(context);
return ListView.builder(
itemCount: contactController.contacts.length,
builder: (_, index) {
reurn Provider.value(
value: contactController.contacts[index],
child: const ContactItem(),
);
}
)

其中 ContactItem 是一个通常看起来像这样的 StatelessWidget:

class ContactItem extends StatelessWidget {
const ContactItem({Key key}): super(key: key);

@override
Widget build(BuildContext context) {
return Text(Provider.of<Contact>(context).name);
}
}

关于flutter - 允许提供者之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57102388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com