我正在构建使用Flutter,Bloc Pattern和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个字段,我将具有 24个仅用于处理流式传输部分的属性(想象一个屏幕上还有更多东西)
所以我的问题是: 使用此模式我在做错什么吗?可以吗可能是我执行错误。
感谢和良好的编码!