Библиотека блоков Flutter: где хранить объект TextEditingController: в состоянии, в классе блоков / Cubit или в виджете?

#flutter #architecture #bloc #cubit

#flutter #архитектура #блок #cubit

Вопрос:

При использовании библиотеки блоков мы храним все переменные в классе состояний. Но где хранить TextEditingController, который не меняется, но его значение меняется?

Допустим, у меня есть класс состояния, подобный этому (просто в качестве примера):

 @freezed
abstract class EditItemState with _$EditItemState {
  const factory EditItemState.updated({
    TextEditingController titleController,
    ShoppingItem shoppingItem,
  }) = _ShoppingListLoaded;
}
 

И классе Cubit:

 class EditItemCubit extends Cubit<EditItemState> {
  EditItemCubit() : super(EditItemState.updated());

  Future<void> titleUpdated() async {
    emit(
      EditItemState.updated().copyWith(
        shoppingItem: state.shoppingItem.copyWith(
          title: state.titleController.text,
        ),
      ),
    );
  }
}
 

Таким образом, логика класса Cubit выглядит беспорядочно. Я предлагаю хранить такие контроллеры непосредственно в виджете или в классе BLoC / Cubit. Это правильный подход?

Ответ №1:

Здесь ребята задали тот же вопрос авторам библиотеки, и ответ Феликса Ангелова (автора flutter_bloc)::

Я бы настоятельно рекомендовал не поддерживать TextEditingController как часть блока. В идеале блоки должны не зависеть от платформы и не зависеть от Flutter. Если вам нужно использовать TextEditingControllers, я бы рекомендовал создать StatefulWidget и поддерживать их как часть класса State. Затем вы можете взаимодействовать с элементом управления в ответ на изменения состояния через BlocListener

Ответ №2:

Лично я сохранил свой в своем классе Cubit. Причина этого в том, что я, скорее всего, буду использовать результат этого контроллера в какой-то момент. Чтобы все было чисто, я ссылаюсь на текст контроллера внутри Cubit, а не передаю текст через событие.

Другая причина заключается в том, что вы можете подписаться на события, например addListener , контроллера внутри Cubit, что будет считаться «бизнес-логикой».

Комментарии:

1. Это звучит разумно, спасибо за ответ!

2. Добро пожаловать! Если этот ответ вам помог, не забудьте принять его 😉