From 3e4b683c33d62603462874a80054d7bb74a29c45 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Tue, 20 Feb 2024 15:57:15 +0300 Subject: [PATCH] feat(diary) Dynamic Meal list and Meal List object --- .../bloc/diary_edit_bloc.dart | 14 +++++ .../bloc/diary_edit_event.dart | 11 ++++ .../bloc/diary_edit_state.dart | 7 ++- .../diary_edit_screen/diary_edit_screen.dart | 44 ++++++++-------- .../models/diary_edit_model.dart | 10 ++-- lib/widgets/custom_edit_drop_down.dart | 51 ++++++++++++------- 6 files changed, 95 insertions(+), 42 deletions(-) diff --git a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart index 9c342c0c..53446fc7 100644 --- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart +++ b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart @@ -21,6 +21,7 @@ class DiaryEditBloc extends Bloc { on(_changeMood); // пользователь нажимает на шкалу настроения on( _changeMealTime); // пользователь изменяет время приема пиши + on(_changeMeal); on(_changeWakeup); // пользователь выбирает время пробуждения on(_changeRetire); // пользователь выбирает время отхода ко сну on(_toggleMood); @@ -214,6 +215,8 @@ class DiaryEditBloc extends Bloc { currentState.mealTimeController = event.time; } } + + FutureOr _changeMeal(ChangeMeal event, Emitter emit) {} } Future uploadImageToServer(String imagePath) async { @@ -241,3 +244,14 @@ TimeOfDay toTime(String timeStr) { TimeOfDay timeOfDay = TimeOfDay(hour: hour, minute: minute); return timeOfDay; } + +List fillMealList() { + return [ + SelectionPopupModel(id: 0, title: "Прием пищи 1", isSelected: true), + SelectionPopupModel(id: 1, title: "Прием пищи 2"), + SelectionPopupModel(id: 2, title: "Прием пищи 3"), + SelectionPopupModel(id: 3, title: "Прием пищи 4"), + SelectionPopupModel(id: 4, title: "Прием пищи 5"), + SelectionPopupModel(id: 5, title: "Прием пищи 6"), + ]; +} diff --git a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart index 7bbdede0..58e8c4ab 100644 --- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart +++ b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart @@ -102,3 +102,14 @@ class UploadImages extends DiaryEditEvent { @override List get props => [image]; } + +class ChangeMeal extends DiaryEditEvent { + ChangeMeal({required this.value}); + + SelectionPopupModel value; + + @override + List get props => [ + value, + ]; +} diff --git a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_state.dart b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_state.dart index 96b8a48a..85c9b104 100644 --- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_state.dart +++ b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_state.dart @@ -29,6 +29,7 @@ class DiaryEditLoadedState extends DiaryEditState { this.productNameController, this.productQuantityController, this.selectedMood, + this.currentMeal, required this.diaryId, required this.selectedSatiety, required this.wakeupExpanded, @@ -37,6 +38,7 @@ class DiaryEditLoadedState extends DiaryEditState { DiaryEditModel? diaryEditModelObj; String? diaryDate; + SelectionPopupModel? currentMeal; TimeOfDay? wakeupController; TimeOfDay? retireController; TimeOfDay? mealTimeController; @@ -64,10 +66,12 @@ class DiaryEditLoadedState extends DiaryEditState { selectedSatiety, diaryId, wakeupExpanded, - moodExpanded + moodExpanded, + currentMeal ]; DiaryEditLoadedState copyWith({ DiaryEditModel? diaryEditModelObj, + SelectionPopupModel? currentMeal, String? diaryDate, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -97,6 +101,7 @@ class DiaryEditLoadedState extends DiaryEditState { selectedMood: selectedMood ?? this.selectedMood, selectedSatiety: selectedSatiety ?? this.selectedSatiety, diaryId: diaryId ?? this.diaryId, + currentMeal: currentMeal ?? this.currentMeal, wakeupExpanded: wakeupExpanded ?? this.wakeupExpanded, moodExpanded: moodExpanded ?? this.moodExpanded); } diff --git a/lib/presentation/diary/diary_edit_screen/diary_edit_screen.dart b/lib/presentation/diary/diary_edit_screen/diary_edit_screen.dart index a15d1a3a..fffaa692 100644 --- a/lib/presentation/diary/diary_edit_screen/diary_edit_screen.dart +++ b/lib/presentation/diary/diary_edit_screen/diary_edit_screen.dart @@ -17,15 +17,6 @@ class DiaryEditScreen extends StatelessWidget { key: key, ); - List mealList = [ - "Прием пищи 1", - "Прием пищи 2", - "Прием пищи 3", - "Прием пищи 4", - "Прием пищи 5", - "Прием пищи 6", - ]; - static Widget builder(BuildContext context) { return BlocProvider( create: (context) => @@ -264,17 +255,25 @@ class DiaryEditScreen extends StatelessWidget { ), SizedBox(height: 20.v), Padding( - padding: EdgeInsets.symmetric(horizontal: 10.h), - child: CustomDropDown( - hintText: "Прием пищи", - items: mealList, - contentPadding: EdgeInsets.symmetric( - horizontal: 10.h, - vertical: 9.v, - ), - onChanged: (value) {}, - ), - ), + padding: EdgeInsets.symmetric(horizontal: 10.h), + child: BlocSelector( + selector: (state) => state.diaryEditModelObj, + builder: (context, diaryEditModelObj) { + return CustomDropDown( + hintText: "Прием пищи", + items: diaryEditModelObj?.mealList, + contentPadding: EdgeInsets.symmetric( + horizontal: 10.h, + vertical: 9.v, + ), + onChanged: (value) { + context + .read() + .add(ChangeMeal(value: value)); + }, + ); + })), SizedBox(height: 20.v), Padding( padding: EdgeInsets.symmetric(horizontal: 10.h), @@ -948,7 +947,10 @@ class DiaryEditScreen extends StatelessWidget { ); if (pickedTime != null && pickedTime != state.wakeupController) { state.wakeupController = pickedTime; - context.read().add(ChangeMealTime(state.diaryId, pickedTime, )); + context.read().add(ChangeMealTime( + state.diaryId, + pickedTime, + )); } } diff --git a/lib/presentation/diary/diary_edit_screen/models/diary_edit_model.dart b/lib/presentation/diary/diary_edit_screen/models/diary_edit_model.dart index b2aaf181..32afe5d1 100644 --- a/lib/presentation/diary/diary_edit_screen/models/diary_edit_model.dart +++ b/lib/presentation/diary/diary_edit_screen/models/diary_edit_model.dart @@ -1,16 +1,20 @@ // ignore_for_file: must_be_immutable import 'package:equatable/equatable.dart'; +import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; /// This class defines the variables used in the [k0_page], /// and is typically used to hold data that is passed between different parts of the application. class DiaryEditModel extends Equatable { - DiaryEditModel(); + DiaryEditModel({this.mealList = const []}); + List mealList; DiaryEditModel copyWith() { - return DiaryEditModel(); + return DiaryEditModel( + mealList: mealList, + ); } @override - List get props => []; + List get props => [mealList]; } diff --git a/lib/widgets/custom_edit_drop_down.dart b/lib/widgets/custom_edit_drop_down.dart index eecbea59..67a2a1f9 100644 --- a/lib/widgets/custom_edit_drop_down.dart +++ b/lib/widgets/custom_edit_drop_down.dart @@ -39,7 +39,7 @@ class CustomDropDown extends StatelessWidget { final TextStyle? textStyle; - final List? items; + final List? items; final String? hintText; @@ -61,9 +61,9 @@ class CustomDropDown extends StatelessWidget { final bool? filled; - final FormFieldValidator? validator; + final FormFieldValidator? validator; - final Function(String)? onChanged; + final Function(SelectionPopupModel)? onChanged; @override Widget build(BuildContext context) { @@ -77,50 +77,67 @@ class CustomDropDown extends StatelessWidget { Widget get dropDownWidget => SizedBox( width: width ?? double.maxFinite, - child: DropdownButtonFormField( + child: DropdownButtonFormField( focusNode: focusNode ?? FocusNode(), icon: icon, autofocus: autofocus!, - items: items?.map>((String value) { - return DropdownMenuItem( - value: value, + style: textStyle ?? theme.textTheme.titleMedium, + items: items?.map((SelectionPopupModel item) { + return DropdownMenuItem( + value: item, child: Text( - value, + item.title, overflow: TextOverflow.ellipsis, + style: hintStyle ?? theme.textTheme.titleMedium, ), ); }).toList(), decoration: decoration, validator: validator, onChanged: (value) { - onChanged!(value.toString()); + onChanged!(value!); }, ), ); InputDecoration get decoration => InputDecoration( hintText: hintText ?? "", - hintStyle: hintStyle ?? theme.textTheme.bodyLarge, + hintStyle: hintStyle ?? theme.textTheme.titleMedium, prefixIcon: prefix, prefixIconConstraints: prefixConstraints, suffixIcon: suffix, suffixIconConstraints: suffixConstraints, isDense: true, - contentPadding: contentPadding ?? EdgeInsets.all(6.h), - fillColor: fillColor, + contentPadding: contentPadding ?? + EdgeInsets.only( + left: 6.h, + top: 6.v, + bottom: 6.v, + ), + fillColor: fillColor ?? theme.colorScheme.onPrimary, filled: filled, border: borderDecoration ?? OutlineInputBorder( borderRadius: BorderRadius.circular(8.h), - borderSide: BorderSide.none, + borderSide: BorderSide( + color: Colors.grey, + width: 1, + ), ), enabledBorder: borderDecoration ?? OutlineInputBorder( - borderRadius: BorderRadius.circular(8.h), - borderSide: BorderSide(color: Colors.grey, width: 1)), + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: Colors.grey, + width: 1, + ), + ), focusedBorder: borderDecoration ?? OutlineInputBorder( - borderRadius: BorderRadius.circular(5.h), - borderSide: BorderSide(color: Colors.grey, width: 1), + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: Colors.grey, + width: 1, + ), ), ); }