如何在颤振中基于同一个流控制器获取多个流?

Posted

技术标签:

【中文标题】如何在颤振中基于同一个流控制器获取多个流?【英文标题】:how to get multiple streams based on the same stream controller in flutter? 【发布时间】:2019-06-14 02:42:07 【问题描述】:

我有一个 Bloc 类,它需要基于同一个流控制器的三个流。

class TodoBloc 

  final _todoController = StreamController<List<TodoModel>>();

  get allTodoStream => _todoController.stream;

  get activeTodoStream => _todoController.stream
          .map<List<TodoModel>>(
              (list) => list.where((item) => item.state == 0));

  get completedTodoStream => _todoController.stream
          .map<List<TodoModel>>(
              (list) => list.where((item) => item.state == 1));

这是一个有状态的待办事项列表。我想在与检索其他状态的流不同的流中检索具有活动状态的待办事项。

我有一个方法负责过滤并根据过滤器值返回一个流。方法如下:

Stream<List<TodoModel>> filterTodoLs(String filter) 
    if (filter == 'all') 
      return todoStream;
     else if (filter == 'completed') 
      return completedStream;
     else if (filter == 'active') 
      return activeStream;
    
    return todoStream;

稍后将在如下小部件中使用:

 return StreamBuilder<List<TodoModel>>(
      stream: bloc.filterTodoLs(filter),
      builder:(BuildContext context, AsyncSnapshot<List<TodoModel>> todoSnapShot) 

目前快照为空。如何过滤原始流并根据应用于该流的过滤器返回不同的流?

【问题讨论】:

您需要使用 BehaviorSubject 而不是 StreamController。 【参考方案1】:

StreamController.broadcast() 创建一个可以有多个侦听器的流。

见https://www.dartlang.org/tutorials/language/streams#broadcast-streams

在不同过滤流之间切换的细节取决于问题中未提供的上下文。

【讨论】:

如果我有一个小部件包装在一个附加到流的流构建器中,并说我在多个地方使用相同的小部件,但单个小部件的更改会更新到所有小部件,因为它们都在听同一个流如何让同一个widget监听不同的流 我知道了,必须创建该类的单个实例才能创建唯一的流

以上是关于如何在颤振中基于同一个流控制器获取多个流?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何在 [Firebase] 中使用 OR 条件获取流查询

基于流的颤振小吃店展示

一个轻量级的基于RateLimiter的分布式限流实现

管理多个选项卡的 webapp 会话数据/控制器流

管理多个选项卡的 webapp 会话数据/控制器流

如何从 Zeppelin 中的控制台流接收器获取输出?