#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. Добро пожаловать! Если этот ответ вам помог, не забудьте принять его 😉