Сложность шаблона Bloc с использованием Stream и BehaviorSubject - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю прототип 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 свойства только для обработки потоковой части (представьте экран со множеством других вещей)

Поэтому мой вопрос: я делаю что-то не так, используя этот шаблон?Это нормально?Может быть, я неправильно это реализую.

Спасибо и хорошее кодирование!

...