Я создаю прототип usgin Flutter, Bloc Pattern и Stream.Как мы знаем, использование Reactive Programming with Stream - один из лучших способов развить хорошо сделанную архитектуру (говорят разработчики Google)
Но я немного запутался, используя этот шаблон из-за сложностиархитектура.
Давайте посмотрим:
Я программирую простую форму для подписки с 8 полями.
Используя StatelessWidget, я сделал что-то вроде ниже:
class RegisterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final RegisterBloc bloc = BlocProvider.of<RegisterBloc>(context);
return Scaffold(
key: _scaffoldKey,
body: new Container(
height: MediaQuery
.of(context)
.size
.height,
child: new SafeArea(
top: false,
bottom: false,
child: Form(
key: _formKey,
child: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
nameField(bloc),
lastNameField(bloc),
emailField(bloc),
passwordField(bloc),
...
...
],
),
),
),
),
));
}
....
}
До этого момента все в порядке.Теперь давайте посмотрим на поле, которое я определил:
Widget nameField(RegisterBloc bloc) {
return StreamBuilder(
stream: bloc.name,
builder: (context, snapshot) {
return TextField(
onChanged: bloc.changeName,
keyboardType: TextInputType.text,
decoration: InputDecoration(
border: OutlineInputBorder(),
icon: Icon(Icons.person_outline),
hintText: 'Name',
labelText: 'Name',
errorText: snapshot.error,
),
);
},
);
}
Приведенный выше код предназначен только для одного поля, и это довольно хорошо.Но ... А как насчет класса Bloc?Здесь мы идем:
class RegisterBloc extends BlocBase with Validators {
final _nameController = BehaviorSubject<String>();
Stream<String> get name => _nameController.stream.transform(validateName);
Function(String) get changeName => _nameController.sink.add;
submit() {
final validName = _nameController.value;
// Do something
}
@override
void dispose() {
_nameController.close();
}
}
Вот важная вещь: для всего одно поле (поле имени) у меня есть 3 свойства это означает, что для 8 field У меня будет 24 свойства только для обработки потоковой части (представьте экран со множеством других вещей)
Поэтому мой вопрос: я делаю что-то не так, используя этот шаблон?Это нормально?Может быть, я неправильно это реализую.
Спасибо и хорошее кодирование!