Я пишу свое приложение 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
на vanilla StreamController
; - Добавьте в поток некоторые значения перед построением представления;
Ничего не происходит,Просто потоки с StreamBuilder
работают хорошо, но невозможно получить последнее значение из свойства last
.
Где может быть проблема?