我有一个简单的用例,我试图重新计算一个提供者在观看项目提供者时提供项目列表,如下所示:
final itemProvider = StateProvider<Item>((ref) {
return Item() ;
});
final itemListProvider = Provider<List<Item>>((ref) {
watch(itemProvider);
...//do something to compute new list
return computedList ;
});
当从外部更改 itemProvider 的状态时,我希望 itemListProvider 自动重新计算,以便 itemListProvider 不断将新项目添加到它提供的现有列表中。 有没有办法使用 Riverpod 以上述特定方式实现这一目标? 我知道我可以使用 StateNotifierProvider 或 StateProvider 并使用状态分配调用更新 itemList,但我期待以被动方式进行。
感谢任何帮助或指导。谢谢!
答案 0 :(得分:0)
这可以通过一个 StateNotifierProvider 轻松完成。
class ItemList extends StateNotifier<List<Item>> {
ItemList() : super([]);
static final provider = StateNotifierProvider<ItemList, List<Item>>((ref) => ItemList());
Item _current = Item();
Item get current => _current;
void addItem(Item item) {
_current = item;
state = [...state, item];
}
}
用法:
// Add an item, which updates the current item
watch(ItemList.provider.notifier).addItem(item);
// Get the current item
final currentItem = watch(ItemList.provider.notifier).current;
// Get the List<Item> from state
final itemList = watch(ItemList.provider);
如果您真的想避免使用 StateNotifierProvider,您可以执行以下操作,但我强烈建议您使用第一种方法。总之:
final itemProvider = StateProvider<Item>((ref) => Item());
final itemListProvider = StateProvider<List<Item>>((ref) => []);
final computedListProvider = Provider<List<Item>>((ref) {
final item = ref.watch(itemProvider);
final itemList = ref.watch(itemListProvider);
WidgetsBinding.instance?.addPostFrameCallback((_) {
if (itemList.state.contains(item.state)) return;
itemList.state = [...itemList.state, item.state];
});
return itemList.state;
});