Обратный вызов Stream.last никогда не срабатывает

Я пишу свое приложение Flutter с шаблоном BLoC. И то, что я хочу, довольно просто: показать 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. Вызов outTitle.last.then() внешние виджеты и из конструктора блока;
  3. Изменить подпись outTitle в ValueObservable и позвонить last.wrapped;
  4. Изменить Rx's BehaviorSubject ванили StreamController;
  5. Добавьте в поток некоторые значения перед построением представления;

Ничего не произошло. Просто потоки с StreamBuilderработает хорошо, но невозможно получить последнее значение из last имущество.

Где может быть проблема?

1 ответ

Решение

last испускается только тогда, когда поток закрыт. В противном случае поток не может знать, что является последним событием.

Когда вы звоните

_titleController.close()

last будет излучать значение.

Другие вопросы по тегам