Пользовательский интерфейс не отделен от логического слоя с использованием блочного шаблона, есть лучший способ?

#flutter #bloc #flutter-bloc #freezed #flutter-freezed

Вопрос:

Я использую freezed с блоком в этом приложении. Мне нужен пользователь, когда нажимаете на кнопку действия с плавающей точкой, появляется нижний лист. когда его форма будет действительна, когда он снова нажмет на кнопку «плавающее действие», его данные будут сохранены в базе данных. это мой код. НО я чувствую, что этот код не отделяет пользовательский интерфейс от логического уровня. Есть ли лучший способ, чем этот?

Код пользовательского интерфейса:

  floatingActionButton: BlocBuilder<HomeCubit, HomeState>(
              builder: (context, state) {
                return InkWell(
                  onTap: () async {
                    if (state.isOpenBottomSheet) {
                      context
                          .read<HomeCubit>()
                          .addNewNoteButton(isOpenBottomSheet: true);
                      _scaffoldKey.currentState!
                          .showBottomSheet(
                              (context) => const AddNewNoteBottomSheet())
                          .closed
                          .then(
                            (_) => context
                                .read<HomeCubit>()
                                .addNewNoteButton(isOpenBottomSheet: true),
                          );
                    } else {
                      if (state.inputTextValue.input.isRight()) {
                        final DBHelper _dbHelper = DBHelper();

                        await _dbHelper.insertNodeToDB(
                          noteDatabaseModel: NoteDatabaseModel(
                            content: state.inputTextValue.input
                                .getOrElse(() => 'invalid note'),
                            status: state.radioValue,
                          ),
                        );
                      }
                    }
                  },
                  child: Container(
                    clipBehavior: Clip.antiAliasWithSaveLayer,
                    height: 11.h,
                    width: 10.h,
                    decoration: BoxDecoration(
                      shape: BoxShape.rectangle,
                      borderRadius: BorderRadius.all(Radius.circular(1.w)),
                      color: const Color(accentColor),
                    ),
                    child: Icon(
                      Icons.add,
                      color: const Color(whiteColor),
                      size: 9.h,
                    ),
                  ),
                );
 

Государственный кодекс:

 @freezed
abstract class HomeState with _$HomeState {
  const factory HomeState({
    required Note inputTextValue,
    required bool isOpenBottomSheet,
  }) = AddNewNoteClicked;
  factory HomeState.init() => HomeState(
        inputTextValue: Note(textInput: ''),
        isOpenBottomSheet: true,
      );
}
 

Код Локтя таков:

 class HomeCubit extends Cubit<HomeState> {
  HomeCubit() : super(HomeState.init());

 void addNewNoteButton({bool? isOpenBottomSheet}) async {
    emit(state.copyWith(isOpenBottomSheet: isOpenBottomSheet ?? true));
  }
}