diff --git a/lib/features/auth/presentation/pages/auth_screen.dart b/lib/features/auth/presentation/pages/auth_screen.dart index 20b0e26c..73162bd2 100644 --- a/lib/features/auth/presentation/pages/auth_screen.dart +++ b/lib/features/auth/presentation/pages/auth_screen.dart @@ -47,12 +47,20 @@ class _AuthScreenState extends State { super.initState(); var keyboardVisibilityController = KeyboardVisibilityController(); keyboardSubscription = keyboardVisibilityController.onChange.listen((bool visible) { - setState(() { - isFocused = visible; - }); + if (mounted) { + setState(() { + isFocused = visible; + }); + } }); } + @override + void dispose() { + keyboardSubscription.cancel(); + super.dispose(); + } + Future _reconnectWebSocket(BuildContext context) async { try { await sl().clear(); diff --git a/lib/features/diary/presentation/widgets/add_product_modal.dart b/lib/features/diary/presentation/widgets/add_product_modal.dart index b55a979f..9b6c2536 100644 --- a/lib/features/diary/presentation/widgets/add_product_modal.dart +++ b/lib/features/diary/presentation/widgets/add_product_modal.dart @@ -14,12 +14,7 @@ class AddProductModal extends StatefulWidget { final DiaryStateLoaded state; final DiaryCubit diaryCubit; - const AddProductModal({ - super.key, - this.portion, - required this.state, - required this.diaryCubit, - }); + const AddProductModal({super.key, this.portion, required this.state, required this.diaryCubit}); @override State createState() => _AddProductModalState(); @@ -58,75 +53,62 @@ class _AddProductModalState extends State { return StatefulBuilder( builder: (BuildContext context, void Function(void Function()) setState) { return Padding( - padding: const EdgeInsets.all(16) + - EdgeInsets.only( - bottom: MediaQuery.of(context).viewInsets.bottom, - ), + padding: const EdgeInsets.all(16) + EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ const Text( 'Добавление блюда', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w600, - color: Color(0xFF323F4B), - ), + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600, color: Color(0xFF323F4B)), ), const SizedBox(height: 16), Row( mainAxisSize: MainAxisSize.min, children: [ SizedBox( - width: MediaQuery.of(context).size.width * 0.8 - 32, + width: MediaQuery.of(context).size.width * 0.76 - 32, child: CustomTextFormField( controller: productNameController, autofocus: true, hintText: 'Введите название продукта/блюда', onChanged: (query) { - EasyDebounce.debounce( - 'glossary-search', - const Duration(milliseconds: 250), - () async { - selectedGlossary = null; - if (query.isEmpty) { - glossariesList = []; - setState(() {}); - return; - } - glossariesList = await widget.diaryCubit.getGlossaryListByQuery(query); + EasyDebounce.debounce('glossary-search', const Duration(milliseconds: 250), () async { + selectedGlossary = null; + if (query.isEmpty) { + glossariesList = []; setState(() {}); - }, - ); + return; + } + glossariesList = await widget.diaryCubit.getGlossaryListByQuery(query); + setState(() {}); + }); }, ), ), const SizedBox(width: 4), SizedBox( - width: MediaQuery.of(context).size.width * 0.2 - 4, + width: MediaQuery.of(context).size.width * 0.24 - 4, child: CustomTextFormField( controller: quantityController, keyboardType: TextInputType.number, hintText: selectedGlossary == null ? '100' : selectedGlossary!.grInPortion == 0 - ? '100' - : '1', + ? '100' + : '1', suffixText: selectedGlossary == null ? 'гр' : selectedGlossary?.grInPortion == 0 - ? 'гр' - : 'шт', + ? 'гр' + : 'шт', ), ), ], ), glossariesList.isEmpty ? const SizedBox(height: 16) : const SizedBox.shrink(), Container( - constraints: const BoxConstraints( - maxHeight: 256, - ), + constraints: const BoxConstraints(maxHeight: 256), child: ListView.separated( physics: const BouncingScrollPhysics(), shrinkWrap: true, @@ -141,28 +123,12 @@ class _AddProductModalState extends State { setState(() {}); FocusManager.instance.primaryFocus?.nextFocus(); }, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - title: Text( - glossariesList[i].name, - style: const TextStyle( - height: 1, - ), - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + title: Text(glossariesList[i].name, style: const TextStyle(height: 1)), subtitle: glossariesList[i].grInPortion == 0 ? null - : Text( - '${glossariesList[i].grInPortion} г', - style: TextStyle( - height: 1, - color: Colors.grey.shade600, - ), - ), - trailing: Icon( - Icons.add_rounded, - color: Colors.grey.shade400, - ), + : Text('${glossariesList[i].grInPortion} г', style: TextStyle(height: 1, color: Colors.grey.shade600)), + trailing: Icon(Icons.add_rounded, color: Colors.grey.shade400), contentPadding: const EdgeInsets.only(left: 12), ); }, @@ -188,14 +154,8 @@ class _AddProductModalState extends State { child: Ink( width: 52, height: 52, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: const Color(0xFFF6F6F6), - ), - child: const Icon( - Icons.delete_outline_rounded, - color: Colors.red, - ), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(20), color: const Color(0xFFF6F6F6)), + child: const Icon(Icons.delete_outline_rounded, color: Colors.red), ), ), if (widget.portion != null) const SizedBox(width: 8), @@ -209,8 +169,8 @@ class _AddProductModalState extends State { portion: selectedGlossary == null ? 'gr' : selectedGlossary!.grInPortion == 0 - ? 'gr' - : 'pcs', + ? 'gr' + : 'pcs', quantity: int.parse(quantityController.text), productNutritionalValueId: selectedGlossary?.id, ); @@ -223,8 +183,8 @@ class _AddProductModalState extends State { portion: selectedGlossary == null ? 'gr' : selectedGlossary!.grInPortion == 0 - ? 'gr' - : 'pcs', + ? 'gr' + : 'pcs', quantity: int.parse(quantityController.text), productNutritionalValueId: selectedGlossary?.id, portionState: widget.portion!.portionState, @@ -237,13 +197,8 @@ class _AddProductModalState extends State { useRootNavigator: true, context: context, builder: (context) => Padding( - padding: EdgeInsets.only( - bottom: MediaQuery.of(context).viewInsets.bottom, - ), - child: GlossaryModerationRequestModalWidget( - productName: productNameController.text, - diaryCubit: widget.diaryCubit, - ), + padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + child: GlossaryModerationRequestModalWidget(productName: productNameController.text, diaryCubit: widget.diaryCubit), ), ); } @@ -252,18 +207,11 @@ class _AddProductModalState extends State { child: Ink( width: MediaQuery.of(context).size.width - (widget.portion == null ? 32 : 92), height: 52, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: appTheme.blueA400, - ), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(20), color: appTheme.blueA400), child: Center( child: Text( widget.portion == null ? 'Добавить' : 'Сохранить', - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.w600, - color: Colors.white, - ), + style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600, color: Colors.white), ), ), ), diff --git a/lib/features/feed/presentation/widgets/diets_widget.dart b/lib/features/feed/presentation/widgets/diets_widget.dart index 34964d1a..d91cdd74 100644 --- a/lib/features/feed/presentation/widgets/diets_widget.dart +++ b/lib/features/feed/presentation/widgets/diets_widget.dart @@ -17,7 +17,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:share_plus/share_plus.dart'; -class DietsWidget extends StatefulWidget { +class DietsWidget extends StatefulWidget { final Diet diet; final int index; const DietsWidget({