我的场景是这样的:
-
底部导航栏,其中一页包含项目列表("列表页面"(,另一页是单个项目("项目页面"(。
-
两个页面都可以导航到与不同项目相关的"项目页面"。
"> itemPage"显示产品的详细信息,并有一个"收藏夹"切换按钮。
在"列表页面"中,通过ListView.builder显示的每个项目,显示并可以处理"收藏夹"切换按钮。
收藏夹"更改反映到其他"itemPage"(如果为同一项目多次打开,是的,这是可能的(以及"pageList"中的同一项目。
我创建了一个 NotifierBloc,每次"收藏夹"切换按钮更改其状态(放置 itemId 和收藏夹的布尔值(时,都会调用 BehaviorSubject> Sink。数据库更新后,输出发布主题>流将填充项目的附加信息。 这样,每次切换"收藏夹"时,所有订阅者都会收到有关该标志的信息。
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 Stream。 流订阅将在 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();
}
问题出在打开新项目页面时:dispose 方法取消上一个显示页面中的订阅,因此不会侦听新事件。
此外,当由于上一页关闭而显示页面时,StreamSubscription 会续订,并且我会收到有关最后一个收藏夹更改的更新,但我需要一个收藏夹更改列表,因为也许用户打开了几个"itemPage"。
我该如何解决?
也许流必须传递给页面(而不是页面状态(?但是如何处理onData函数呢?
你需要某种状态管理系统。看看Provider
.下面是如何使用它的简单示例。https://github.com/m-Skolnick/provider_example_flutter