【发布时间】:2021-08-11 12:20:21
【问题描述】:
我对flutter和riverpod很陌生,所以如果问题不清楚,我很抱歉,如果是这样,请告诉我
我有 2 个提供者,一个监听 FireStore 集合的实时变化,另一个是 List Service,用于处理从 FireStore 接收到的项目的实际列表。我想将收到的列表添加到 itemList 中,然后通知监听 itemListProvider 的小部件,以便可以重建列表视图
项目列表状态通知提供者
final itemListProvider =
StateNotifierProvider<ItemListService, List<Item>>(
(ref) => ItemListService([]));
实时监听器
final firestoreListUpdateWatcher = Provider((ref) {
//Listens to a stream which provide query snapshot, this works as intended
final firestoreListWatcher = ref.watch(firestoreListProvider);
//using `ref.watch(itemListProvider.notifier)` because i want to be able
//to change the state from this provider
final itemListProvider = ref.watch(itemListProvider.notifier);
firestoreLisUpdateWatcher.when(
data: (value) {
for (int i = 0; i < value.docChanges.length; i++) {
QueryDocumentSnapshot currentQuery = value.docs[i];
//current item in list
ListItem item = fireStoreList.fromMap(currentQuery.data());
//add current item to the ListService
itemListProvider.add(item);
}
},
loading: () {},
error: (err, stack) {});
});
项目列表服务类
class ItemListService extends StateNotifier<List<Item>> {
ItemListService(List<Item> itemList):super(itemListList ?? []);
void add(Item it) {
state = [...state, it];
}
//more methods modifying the list....
}
在我的小部件的构建函数中,我只想监听 itemListProvider 的更改并根据当前状态重新创建列表
这不起作用,当对列表进行更改时,我的小部件不会重建。我相信它不起作用的原因是因为当我使用ref.watch(itemListProvider.notifier) 在我的“firestoreListUpdateWatcher”中创建“观察者”时,我创建了一个我的小部件没有监听的新实例,因此在发生更改时不会收到通知。这个假设正确吗?
另外,我怎样才能实现这种行为(从另一个提供者修改列表)
有没有更好的方法来设计我的应用来避免这种限制?
提前感谢您的帮助
【问题讨论】:
标签: android firebase flutter riverpod