我的情况是这样的:
一个BottomNavigationBar,其中一个页面包含一个项目列表(“ listPage”),另一个页面是单个项目(“ itemPage”)。
两个页面都可以导航到与其他项目相关的“ itemPage”。
“ itemPage”显示产品的详细信息,并具有“收藏夹”切换按钮。
在“ listPage”中,通过ListView.builder显示的每个项目,显示并可以处理“收藏夹”切换按钮。
我不明白如何将“ itemPage”中的“收藏夹”更改反映给其他“ itemPage”(如果多次打开同一项目,是的,这是可能的),以及如何反映到“ pageList”中的同一项目。
我创建了一个NotifierBloc,每当“收藏夹”切换按钮更改其状态(将itemId和收藏夹的布尔值放入)时,都会调用BehaviorSubject> Sink。数据库更新后,输出PublishSubject>流将填充该项的其他信息。这样,每次切换“收藏夹”时,所有订阅者都会收到有关该标志的信息。
BehaviorSubject<Item> inController = new BehaviorSubject<Item>();
Sink<Item> get putUpdate => inController.sink;
final PublishSubject<Item> outController = PublishSubject<Item>();
Stream<Item> get getUpdates => outController.stream;
NotifierBloc() {
inController.listen(_handleToggle);
}
_handleToggle(Item item) {
...
outController.sink.add(newItemAfterDatabaseCall);
}
在ListPage和ItemPage(均为StatefulWidget)中,我在DidChangeDependencies方法中创建了一个StreamSubscription,该方法可以监听NotifierBloc流。StreamSubscription将在Dispose方法中取消。
StreamSubscription _subscription;
void didChangeDependencies() {
super.didChangeDependencies();
_subscription = _notifierBloc.getUpdates.listen((item) => {
// Do things with the Item like setState or call bloc methods
...
});
}
void dispose() {
_subscription?.cancel();
super.dispose();
}
问题是在打开新的itemPage时:在上一个显示的页面中,dispose方法取消了预订,因此将不监听新事件。
此外,由于上一页关闭而显示页面时,StreamSubscription会更新,并且我会获得有关最后一个收藏夹更改的更新,但是我需要收藏夹更改的列表,因为用户可能打开了几个“ itemPage” 。
我该如何解决?
也许流必须传递到Page(不是PageState)?但是如何处理onData函数呢?
您需要某种状态管理系统。查看Provider
。这是一个如何使用它的简单示例。 https://github.com/m-Skolnick/provider_example_flutter