Обратный вызов 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 вызывает конструктор только один раз с нулевыми данными и "ожидающим" состоянием соединения.
Что я пробовал:
- замещать
FutureBuilder
сStreamBuilder
а такжеoutTitle.last
сoutTitle.last.asStream()
; - Вызов
outTitle.last.then()
внешние виджеты и из конструктора блока; - Изменить подпись
outTitle
вValueObservable
и позвонитьlast.wrapped
; - Изменить Rx's
BehaviorSubject
ванилиStreamController
; - Добавьте в поток некоторые значения перед построением представления;
Ничего не произошло. Просто потоки с StreamBuilder
работает хорошо, но невозможно получить последнее значение из last
имущество.
Где может быть проблема?
1 ответ
Решение
last
испускается только тогда, когда поток закрыт. В противном случае поток не может знать, что является последним событием.
Когда вы звоните
_titleController.close()
last
будет излучать значение.