forked from eatvio/eatvio_app
feat(diary) Addeed mood and satiety picker scale to the screen
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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("😊"),
|
||||
// Остальные элементы шкалы
|
||||
],
|
||||
),
|
||||
])));
|
||||
}
|
||||
|
||||
28
lib/widgets/custom_scale_element.dart
Normal file
28
lib/widgets/custom_scale_element.dart
Normal 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,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user