Я написал несколько простых приложений флаттера, которые используют виджеты / формы / текстовые поля с отслеживанием состояния для ввода и управления данными. Теперь я пытаюсь понять, как использовать BLoC и streambuilder для выполнения аналогичной работы. Но я не могу понять, как установить начальные значения для моих полей.
Я попытался создать простейший пример крошечного приложения с использованием блока. Это просто берет имя, которое вводится в TextField, и выводит его на следующую строку.
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Bloc Example',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
MyHomePage();
String initialData = 'Fred';
@override
Widget build(BuildContext context) {
TextEditingController _controller = new TextEditingController();
return Scaffold(
appBar: AppBar(title: Text('Bloc Example')),
body: Center(
child: Column(
children: <Widget>[
StreamBuilder(
initialData: initialData,
stream: bloc.nameStream,
builder: (context, snapshot) {
if ( snapshot.connectionState == ConnectionState.waiting)
_controller.text = snapshot.data;
return TextField(
controller: _controller,
onChanged: bloc.nameChangedStream,
decoration: InputDecoration(labelText: 'Enter name' ),
);
}
),
StreamBuilder(
initialData: initialData,
stream: bloc.nameStream, //
builder: (context, snapshot) {
return Text('Name is ${snapshot.hasData ? snapshot.data : 'unknown'}');
}
),
],
),
),
);
}
}
class Bloc
{
final nameStreamController = BehaviorSubject<String>();
Stream<String> get nameStream => nameStreamController.stream;
Function(String) get nameChangedStream => nameStreamController.sink.add ;
}
final Bloc bloc = new Bloc();
Я не могу понять, как указать начальное значение в поле моего имени.
Я должен признать, что, имея опыт программирования в старом стиле, мне нужно время, чтобы сосредоточиться на реактивном программировании - но вперед и вверх!
ИЗМЕНИТЬ - благодаря предоставленным комментариям - обновил код, чтобы использовать комбинацию TextEditingController и StreamBuilder initialData и, похоже, работает нормально. С радостью приму дальнейшие комментарии, если есть лучшее решение :)