Stream.last回调永不触发

时间:2018-12-19 08:03:26

标签: asynchronous dart flutter rxdart

我正在用BLoC模式编写Flutter应用程序。我想要的很简单:显示一个TextField,将流中的最后一个值作为初始值。

有一个简单的集团:

class MyBloc {
  BehaviorSubject<String> _titleController;
  Stream<String> get outTitle => _titleController.stream;
  Sink<String> get inTitle => _titleController.sink;

  MyBloc(Model model) {
    _titleController = BehaviorSubject(seedValue: model.title); 
  }
}

还有使用FutureBuilder的视图:

@override
Widget build(BuildContext context) {
  var bloc = /* get the bloc from a widgets' hierarchy */
  return FutureBuilder(
    future: bloc.outTitle.last,
    builder: (context, snapshot) {
      return TextField(
        controller: TextEditingController.fromValue(
          TextEditingValue(text: snapshot.data ?? 'null')
        ),
      );
    }
  );
}

问题在于,FutureBuilder仅使用空数据和“等待”连接状态调用构建器一次。

我尝试过的事情:

  1. FutureBuilder替换为StreamBuilder,将outTitle.last替换为outTitle.last.asStream()
  2. 在窗口小部件外部和从bloc构造函数中调用outTitle.last.then()
  3. outTitle的签名更改为ValueObservable并调用last.wrapped;
  4. 将Rx的BehaviorSubject更改为香草StreamController
  5. 添加以在构建视图之前流式传输一些值;

什么都没发生。 只是带有StreamBuilder的流才能很好地工作,但是不可能从last属性中获取最后一个值。

问题出在哪里?

1 个答案:

答案 0 :(得分:0)

last仅在流关闭时发出。否则,流将不知道最后一个事件是什么。

致电时

_titleController.close()

last将发出一个值。