使用Stream和BehaviorSubject的Bloc模式的复杂性

时间:2018-11-20 01:26:34

标签: stream flutter reactive-programming

我正在构建使用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个仅用于处理流式传输部分的属性(想象一个屏幕上还有更多东西)

所以我的问题是: 使用此模式我在做错什么吗?可以吗可能是我执行错误。

感谢和良好的编码!

0 个答案:

没有答案