Обратный вызов Stream.last никогда не срабатывает - PullRequest
0 голосов
/ 19 декабря 2018

Я пишу свое приложение 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 на vanilla StreamController;
  5. Добавьте в поток некоторые значения перед построением представления;

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

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

1 Ответ

0 голосов
/ 19 декабря 2018

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

При вызове

_titleController.close()

last выдаст значение.

...