#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));
}
}