flutter - Flutter - 在页面更改时继续收听流
问题描述
我的场景是这样的:
一个BottomNavigationBar,其中一个页面包含项目列表(“listPage”),另一页是单个项目(“itemPage”)。
两个页面都可以导航到与不同项目相关的“itemPage”。
“itemPage”显示产品的详细信息,并有一个“Favorite”切换按钮。
在“listPage”中通过 ListView.builder 显示的每个项目,显示并可以处理“收藏夹”切换按钮。
我不明白如何将“itemPage”中的“Favorite”更改反映到其他“itemPage”(如果为同一项目多次打开,是的,这是可能的)以及“pageList”中的同一项目。
我创建了一个 NotifierBloc,其中每次“收藏夹”切换按钮更改其状态(放置 itemId 和收藏夹的布尔值)时都会调用 BehaviorSubject > Sink。数据库更新后,输出 PublishSubject > Stream 将填充项目的附加信息。这样,每次切换“收藏夹”时,所有订阅者都会收到有关该标志的信息。
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”。
我该如何解决?
也许必须将 Stream 传递给 Page(而不是 PageState)?但是如何处理 onData 函数呢?
解决方案
你需要某种状态管理系统。调查Provider
。这是一个如何使用它的简单示例。https://github.com/m-Skolnick/provider_example_flutter
推荐阅读
- google-places-api - 每次用户查看我网站上的页面以显示图像时,我是否需要请求 Google-places-api?
- linux - cpupower 监视器中的 C-state Cx 是什么
- c# - 当我调用 ExecuteScalar 时,',' 附近的语法不正确
- java - 从属性文件中读取反斜杠
- php - mySQL 有时会搜索 null
- wordpress - Wordpress 文章三分之一部分中的组件
- html - CSS中的水平滚动
- jackson - 在流数据解析时从 JSON 模式中选择任何元素
- c# - 如何修复“列的类型值与先前观察到的类型不同”
- reactjs - 如何防止在 ssr 中首次加载 react-loadable?