feat(diary) Addeed mood and satiety picker scale to the screen

This commit is contained in:
2024-02-15 13:08:50 +03:00
parent 57a7f9bd91
commit 397b579e56
5 changed files with 158 additions and 25 deletions

View File

@@ -50,6 +50,8 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
mealTimeController: currentState.mealTimeController,
mealNameController: currentState.mealNameController,
productNameController: currentState.productNameController,
selectedSatiety: currentState.selectedSatiety,
selectedMood: currentState.selectedMood,
productQuantityController: currentState.productQuantityController));
} else {
// Если текущее состояние - начальное, создаем новое загруженное состояние
@@ -59,6 +61,8 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
wakeupController: TimeOfDay.now(),
retireController: TimeOfDay.now(),
mealTimeController: TimeOfDay.now(),
selectedSatiety: 3,
selectedMood: 3,
mealNameController: TextEditingController(),
commentController: TextEditingController(),
productNameController: TextEditingController(),
@@ -85,3 +89,12 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
emit(state.copyWith(wakeupExpanded: !state.wakeupExpanded));
}*/
}
class ScaleBloc extends Bloc<ScaleEvent, int> {
ScaleBloc() : super(0);
@override
Stream<int> mapEventToState(ScaleEvent event) async* {
yield event.selectedElement;
}
}

View File

@@ -15,4 +15,12 @@ class DiaryEditInitialEvent extends DiaryEditEvent {
List<Object?> get props => [];
}
class ScaleEvent extends Equatable {
final int selectedElement;
ScaleEvent(this.selectedElement);
@override
List<Object> get props => [selectedElement];
}
//class ToggleWakeupExpandedEvent extends DiaryEditEvent {}

View File

@@ -27,6 +27,8 @@ class DiaryEditLoadedState extends DiaryEditState {
this.mealNameController,
this.productNameController,
this.productQuantityController,
this.selectedMood,
required this.selectedSatiety,
required this.wakeupExpanded,
required this.moodExpanded})
: super(diaryEditModelObj: null);
@@ -39,6 +41,8 @@ class DiaryEditLoadedState extends DiaryEditState {
TextEditingController? commentController;
TextEditingController? productNameController;
TextEditingController? productQuantityController;
int? selectedMood;
int selectedSatiety;
bool wakeupExpanded;
bool moodExpanded;
@override
@@ -53,6 +57,8 @@ class DiaryEditLoadedState extends DiaryEditState {
TextEditingController? commentController,
TextEditingController? productNameController,
TextEditingController? productQuantityController,
int? selectedMood,
required int selectedSatiety,
required bool wakeupExpanded,
required bool moodExpanded,
}) {
@@ -67,6 +73,8 @@ class DiaryEditLoadedState extends DiaryEditState {
productNameController ?? this.productNameController,
productQuantityController:
productQuantityController ?? this.productQuantityController,
selectedMood: selectedMood ?? this.selectedMood,
selectedSatiety: selectedSatiety,
wakeupExpanded: wakeupExpanded,
moodExpanded: moodExpanded);
}

View File

@@ -7,6 +7,7 @@ import 'package:eatvio_app/core/app_export.dart';
import 'package:eatvio_app/widgets/custom_edit_text_form_field.dart';
import 'package:eatvio_app/widgets/custom_edit_drop_down.dart';
import 'package:eatvio_app/widgets/custom_outlined_button.dart';
import 'package:eatvio_app/widgets/custom_scale_element.dart';
// ignore: must_be_immutable
class DiaryEditScreen extends StatelessWidget {
@@ -197,6 +198,7 @@ class DiaryEditScreen extends StatelessWidget {
_buildMeal(BuildContext context, DiaryEditLoadedState state) {
final digitsOnly = FilteringTextInputFormatter.digitsOnly;
final ScaleBloc scaleBloc = ScaleBloc();
return Padding(
padding: EdgeInsets.symmetric(horizontal: 16.h),
child: Container(
@@ -297,20 +299,56 @@ class DiaryEditScreen extends StatelessWidget {
style: CustomTextStyles.bodyMediumBlack900,
),
SizedBox(height: 15.v),
CustomDropDown(
icon: Container(
margin: EdgeInsets.fromLTRB(30.h, 30.v, 20.h, 30.v),
child: CustomImageView(
imagePath: ImageConstant.imgArrowLeft,
height: 10.v,
width: 18.h,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("😭"),
ScaleElement(
color: Colors.red,
isSelected: state.selectedSatiety == 0,
onTap: () {
scaleBloc.add(ScaleEvent(0));
},
),
),
hintText: "Сытость",
items: satietyList,
borderDecoration: InputBorder.none,
onChanged: (value) {},
),
ScaleElement(
color: Colors.orange,
isSelected: state.selectedSatiety == 1,
onTap: () {
scaleBloc.add(ScaleEvent(1));
},
),
ScaleElement(
color: Colors.yellow,
isSelected: state.selectedSatiety == 2,
onTap: () {
scaleBloc.add(ScaleEvent(2));
},
),
ScaleElement(
color: Colors.lime,
isSelected: state.selectedSatiety == 3,
onTap: () {
scaleBloc.add(ScaleEvent(3));
},
),
ScaleElement(
color: Colors.lightGreen,
isSelected: state.selectedSatiety == 4,
onTap: () {
scaleBloc.add(ScaleEvent(4));
},
),
ScaleElement(
color: Colors.green,
isSelected: state.selectedSatiety == 5,
onTap: () {
scaleBloc.add(ScaleEvent(5));
},
),
Text("😊"),
// Остальные элементы шкалы
],
)
],
),
));
@@ -757,6 +795,8 @@ class DiaryEditScreen extends StatelessWidget {
Widget _buildMood(
List<String> moodList, BuildContext context, DiaryEditLoadedState state) {
final ScaleBloc scaleBloc = ScaleBloc();
return Padding(
padding: EdgeInsets.symmetric(horizontal: 16.h),
child: Container(
@@ -796,19 +836,55 @@ class DiaryEditScreen extends StatelessWidget {
),
),
if (state.moodExpanded)
CustomDropDown(
icon: Container(
margin: EdgeInsets.fromLTRB(30.h, 30.v, 20.h, 30.v),
child: CustomImageView(
imagePath: ImageConstant.imgArrowLeft,
height: 10.v,
width: 18.h,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("😭"),
ScaleElement(
color: Colors.red,
isSelected: state.selectedMood == 0,
onTap: () {
scaleBloc.add(ScaleEvent(0));
},
),
),
hintText: "Ваше настроение после приема пищи",
items: moodList,
borderDecoration: InputBorder.none,
onChanged: (value) {},
ScaleElement(
color: Colors.orange,
isSelected: state.selectedMood == 1,
onTap: () {
scaleBloc.add(ScaleEvent(1));
},
),
ScaleElement(
color: Colors.yellow,
isSelected: state.selectedMood == 2,
onTap: () {
scaleBloc.add(ScaleEvent(2));
},
),
ScaleElement(
color: Colors.lime,
isSelected: state.selectedMood == 3,
onTap: () {
scaleBloc.add(ScaleEvent(3));
},
),
ScaleElement(
color: Colors.lightGreen,
isSelected: state.selectedMood == 4,
onTap: () {
scaleBloc.add(ScaleEvent(4));
},
),
ScaleElement(
color: Colors.green,
isSelected: state.selectedMood == 5,
onTap: () {
scaleBloc.add(ScaleEvent(5));
},
),
Text("😊"),
// Остальные элементы шкалы
],
),
])));
}

View File

@@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
class ScaleElement extends StatelessWidget {
final Color color;
final bool isSelected;
final VoidCallback onTap;
const ScaleElement({
required this.color,
required this.isSelected,
required this.onTap,
});
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
child: Container(
width: isSelected ? 40 : 20,
height: isSelected ? 40 : 20,
decoration: BoxDecoration(
color: color,
shape: BoxShape.circle,
),
),
);
}
}