gpt4 book ai didi

android - 如何修改 Riverpod 中另一个提供者的 StateNotifier 提供者的状态?

转载 作者:行者123 更新时间:2023-12-04 23:59:16 24 4
gpt4 key购买 nike

我是 flutter 和 riverpod 的新手,所以如果问题不清楚,我非常抱歉,如果是这种情况,请告诉我

我有 2 个提供程序,一个监听 FireStore 集合的实时变化,另一个是列表服务,用于处理从 FireStore 收到的实际项目列表。我想将接收到的列表添加到itemList中,然后通知监听itemListProvider的widgets,以便重建listview

项目列表状态通知程序提供程序

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”中创建“watcher”时,我创建了一个我的小部件没有监听的新实例因此在发生更改时不会收到通知。这个假设是否正确?

此外,我怎样才能实现这种行为(修改来自其他供应商的列表)

有没有更好的方法来设计我的应用程序来避免这种限制?

预先感谢您的帮助

最佳答案

正如您所说,ref.watch 正在重新创建提供者,这就是为什么您看不到更改的原因,您可以使用当前逻辑做的事情是观看流而不是提供者并使用监听器更新状态在同一个 itemListProvider 中而不创建另一个 Provider:

/// This is your StateNotifierProvider
final itemListProvider = StateNotifierProvider.autoDispose<ItemListService, List<Item>>((ref) {
//Listen to the stream itself instead of the value hold by the provider
final firestoreListStream = ref.watch(firestoreListProvider.stream);

//Create the instance of your StateNotifier
final itemListProvider = ItemListService([]);

/// subscribe to the stream to change the state accordingly
final subscription = firestoreListStream.listen((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);
}
});
/// When you stop using this porvider cancel the subscription to the stream, to avoid memory leaks
ref.onDispose(subscription.cancel);
return itemListProvider;
});

有了它,您将不需要另一个 Provider (firestoreListUpdateWatcher)

作为一项建议,我注意到您遍历一个 for 循环并单独添加它们,这将强制状态更新多次,我建议先获取列表,然后使用 addAll 方法更新状态

final subscription = firestoreListStream.listen((value) {
List<ListItem> items = [];
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
items.add(item);
}
ItemListService.addAll(items);

});

然后在您的 ItemsService 中创建 addAll 方法

void addAll(Iterable<Item> it) {
state = [...state, ...it];
}

关于android - 如何修改 Riverpod 中另一个提供者的 StateNotifier 提供者的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67650983/

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