Riverpod:重新计算提供接收更新项目列表的提供者

时间:2021-04-19 18:21:10

标签: flutter riverpod

我有一个简单的用例,我试图重新计算一个提供者在观看项目提供者时提供项目列表,如下所示:

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,但我期待以被动方式进行。

感谢任何帮助或指导。谢谢!

1 个答案:

答案 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;
});