首页 > 解决方案 > 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();
  }
}

标签: dartflutterrxdartbloc

解决方案


当我使用行为主题时,这不应该是一个问题,经过调查,我发现在某些情况下会再次创建该集团,这导致了这个问题。

我是如何找到的

向 bloc 构造函数添加了一个日志 向 bloc 提供程序添加了一个日志 - 也记录了调用者

结果

当我关闭 showSearch - 它触发重新创建 bloc 的父级的 build 方法。

解决方案 将provider移到上一层,所以build方法即使多次调用也不会导致问题这仍然没有解决它,因为我使用了pushReplacement,pushReplacement导致上下文创建了一个新的块。最后将提供者移到顶部,所以我的材料应用程序是提供者的孩子。由于导航器是材料的一部分,因此即使使用 pushReplacement 也能解决问题。


推荐阅读