【问题标题】:Initial value with StreamController without RxDartStreamController 没有 RxDart 的初始值
【发布时间】:2019-04-20 03:25:01
【问题描述】:

我将 StreamControllers 与 Flutter 一起使用。我有一个带有一些默认值的模型。从我正在收听流的小部件中,我想提供一些默认值。我可以看到我可以在 StreamBuilder 上设置一个初始值,但我想使用来自 bloc 内部模型的数据作为初始数据。因此,一旦有人使用快照数据,他们就会获得默认值。我已经看到 RxDart 有一个种子值,只是想知道如果不替换 RxDart 是否可能?

【问题讨论】:

  • StreamController#add ?
  • 哦,我的糟糕,我在构造函数中进行设置之前添加到接收器中。现在,创建所有内容后,我将初始模型值添加为构造函数的最后一部分,并且按预期工作。 @pskink 你能补充一个答案吗:)

标签: flutter


【解决方案1】:

你要找的是StreamController#add方法,

发送数据事件。

侦听器在稍后的微任务中接收此事件。

请注意,同步控制器(通过将 true 传递给 StreamController 构造函数的同步参数)传递事件 立即地。由于这种行为违反了这里提到的合同, 同步控制器只能按照描述使用 文档以确保交付的事件始终显示为 它们是在单独的微任务中交付的。

快乐飘飘

【讨论】:

    【解决方案2】:

    可以在为该流添加监听器后初始化类时指定该流的默认值。

    import 'dart:async';
    
    enum CounterEvent { increase }
    
    class CounterBloc {
      int value = 0;
    
      final _stateCntrl = StreamController<int>();
      final _eventCntrl = StreamController<CounterEvent>();
    
      Stream<int> get state => _stateCntrl.stream;
      Sink<CounterEvent> get event => _eventCntrl.sink;
    
      CounterBloc() {
        _eventCntrl.stream.listen((event) {
          _handleEvent(event);
        });
        _stateCntrl.add(value); // <--- add default value
      }
    
      void dispose() {
        _stateCntrl.close();
        _eventCntrl.close();
      }
    
      _handleEvent(CounterEvent event) async {
        if (event == CounterEvent.increase) {
          value++;
        }
        _stateCntrl.add(value);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多