我有一个UserNotifier
,它有一个user
对象作为state
,这个对象有一些属性,包括用户最喜欢的主题ID的列表.我还有另外一个TopicsAsyncNotifier
,它的topic
个对象的列表为state
,但是,这个列表必须基于用户的Collection 主题ID创建,因此在TopicsNotifierProvider
的build
方法中,我首先必须从存储库中加载主题,然后我必须让userNotifier
实例读取用户主题ID,最后使用主题列表和用户主题ID创建一个新的Topic
对象,该对象具有一个附加属性,该属性指示该主题是否出现在Collection 用户主题中,这是一种isSelected, isFavorite
标志.让我来展示一下,以便更好地理解.
class FollowedTopicsNotifier extends AsyncNotifier<List<FollowableTopic>> {
@override
FutureOr<List<FollowableTopic>> build() async {
final topics = await ref.watch(topicsRepository).fetchTopics();
final user = ref.read(userNotifier);
final followedTopics = topics.map(
(topic) => FollowableTopic(
topic: topic,
isFollowed: user.followedTopics.contains(topic.id)
)
).toList();
return followedTopics;
}
void updateTopics(String topicId, bool isSelected) {
... // logic to update state
}
}
我只需要在TopicsAsyncNotifier
初始化时执行build
方法,当用户将新主题添加到Collection 夹时,我将使用updateTopics
方法更新主题列表.所以我的问题是:文档说使用ref.read
in build
方法是不好的做法,但是如果我使用ref.watch
或ref.watch(provider.select)
来检索用户主题ID的列表,当我向用户列表添加新主题时,TopicsAsyncNotifier
的build
方法将再次被调用,我不希望这样,因为这会再次加载初始主题,并且我已经在状态中加载了它们,所以我如何才能只从UserNotifier
读取一次值来初始化TopicsAsyncNotifier
而不使用ref.watch
和ref.watch(provider.select)
呢?我想过使用一个ProviderScope来处理TopicsAsyncNotifier
,并在他的构造函数中传递初始的用户主题ID,但我不知道这是不是一个好方法.
我希望得到任何关于如何实现所需行为的建议,或者可能是使用其他提供者数据初始化提供者而不会暂停更改的其他方法(无需参考观察).
非常感谢你的咀嚼!