dart - Flutter - rxdart - 多次读取流
问题描述
我有一个简单的应用程序,它有 2 个选项卡,我正在尝试使用 bloc 模式来移动数据。
流程 1: 1. 使用种子值创建应用程序启动块 2. 为页面运行构建方法并显示数据 3. 用户切换到另一个选项卡 4. 用户切换回来,在这种情况下没有数据显示,因为 steam 有已经被读过一次。
一种选择是重新订阅以再次发送种子值。
流程 2: 1. 使用种子值创建应用程序启动块 2. 为页面运行构建方法并显示数据 3. 用户更改过滤器 - 加载流数据的触发 3. 用户切换到另一个选项卡 4.用户切换回来,在这种情况下没有数据显示,因为蒸汽已经被读取过一次。
在这种情况下,我希望过滤器保持原位并且不想使用种子值
集团
class DemoBloc {
final DemoApi demoApi;
Stream<String> _results = Stream.empty();
Stream<String> get results => _results;
BehaviorSubject<String> _tabName =
BehaviorSubject<String>.seeded('abc');
// BehaviorSubject<String> _tabName =
// BehaviorSubject<String>();
Sink<String> get tabName => _tabName;
DemoBloc(this.demoApi) {
print('initialized');
_results = _tabName
.asyncMap((tab) => tab)
.asBroadcastStream();
}
void dispose() {
_tabName.close();
}
}
解决方案
当我使用行为主题时,这不应该是一个问题,经过调查,我发现在某些情况下会再次创建该集团,这导致了这个问题。
我是如何找到的
向 bloc 构造函数添加了一个日志 向 bloc 提供程序添加了一个日志 - 也记录了调用者
结果
当我关闭 showSearch - 它触发重新创建 bloc 的父级的 build 方法。
解决方案 将provider移到上一层,所以build方法即使多次调用也不会导致问题这仍然没有解决它,因为我使用了pushReplacement,pushReplacement导致上下文创建了一个新的块。最后将提供者移到顶部,所以我的材料应用程序是提供者的孩子。由于导航器是材料的一部分,因此即使使用 pushReplacement 也能解决问题。
推荐阅读
- python - 如何嵌套饼图并将嵌套的楔形作为Python中较大楔形的百分比?
- android - 更改安卓应用程序名称
- angular - Angular HTTPClient 动态获取 Id
- c++ - C++ 系统();函数未按预期工作/C++ 中的 Windows 控制台命令
- .net - 符号不能在 Docker 容器中加载
- wordpress - Wordpress - 如何访问不在媒体库中的上传内容?
- react-redux - 从 Redux 存储中检索状态
- css - 文本框不会环绕图像
- rabbitmq - RabbitMQ 在固定大小队列上的消息比预期的多
- python - 避免嵌套 .apply()