From 1584e5cb4318ffe681c129ce80eedc9a796dc42e Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 20 Aug 2025 13:52:25 +0200 Subject: [PATCH] fix back button nav --- .../mih_package_components/mih_package.dart | 148 +++++++++++------- .../mih_package_components/mih_scack_bar.dart | 18 +++ 2 files changed, 108 insertions(+), 58 deletions(-) create mode 100644 Frontend/lib/mih_components/mih_package_components/mih_scack_bar.dart diff --git a/Frontend/lib/mih_components/mih_package_components/mih_package.dart b/Frontend/lib/mih_components/mih_package_components/mih_package.dart index f7718a09..ba06efae 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_package.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_package.dart @@ -1,4 +1,8 @@ +import 'package:flutter/services.dart'; +import 'package:go_router/go_router.dart'; +import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_scack_bar.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; import 'package:flutter/material.dart'; @@ -31,6 +35,7 @@ class _MihPackageState extends State with SingleTickerProviderStateMixin { late PageController _pageController; late AnimationController _animationController; + DateTime? lastPressedAt; void unfocusAll() { FocusScope.of(context).unfocus(); @@ -113,69 +118,96 @@ class _MihPackageState extends State Size screenSize = MediaQuery.of(context).size; return GestureDetector( onTap: unfocusAll, - child: Scaffold( - drawer: widget.actionDrawer, - body: SafeArea( - bottom: false, - minimum: EdgeInsets.only(bottom: 0), - child: Container( - width: screenSize.width, - height: screenSize.height, - //color: Colors.black, - padding: const EdgeInsets.only(top: 5), - child: Column( - children: [ - Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - widget.appActionButton, - const SizedBox( - width: 10, - ), - Expanded( - child: Container( - // alignment: Alignment.center, - // alignment: Alignment.centerRight, - alignment: Alignment.centerLeft, - // color: Colors.black, - child: FittedBox( - child: Text( - widget.appToolTitles != null - ? widget - .appToolTitles![widget.selectedbodyIndex] - : "", - style: const TextStyle( - fontSize: 23, - fontWeight: FontWeight.w600, + child: PopScope( + canPop: false, + onPopInvokedWithResult: (bool didPop, Object? result) { + if (GoRouterState.of(context).name == 'mihHome') { + if (lastPressedAt == null || + DateTime.now().difference(lastPressedAt!) > + const Duration(seconds: 2)) { + // First press: show a message and update the timestamp. + lastPressedAt = DateTime.now(); + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("Press back again to exit"), + ), + ); + } else { + // Second press within 2 seconds: exit the app. + KenLogger.warning('Exiting app...'); // Your custom logger + SystemChannels.platform.invokeMethod('SystemNavigator.pop'); + } + } else { + context.goNamed( + 'mihHome', + extra: true, + ); + } + }, + child: Scaffold( + drawer: widget.actionDrawer, + body: SafeArea( + bottom: false, + minimum: EdgeInsets.only(bottom: 0), + child: Container( + width: screenSize.width, + height: screenSize.height, + //color: Colors.black, + padding: const EdgeInsets.only(top: 5), + child: Column( + children: [ + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + widget.appActionButton, + const SizedBox( + width: 10, + ), + Expanded( + child: Container( + // alignment: Alignment.center, + // alignment: Alignment.centerRight, + alignment: Alignment.centerLeft, + // color: Colors.black, + child: FittedBox( + child: Text( + widget.appToolTitles != null + ? widget + .appToolTitles![widget.selectedbodyIndex] + : "", + style: const TextStyle( + fontSize: 23, + fontWeight: FontWeight.w600, + ), ), ), ), ), - ), - const SizedBox( - width: 5, - ), - widget.appTools, - ], - ), - const SizedBox(height: 5), - Expanded( - child: PageView.builder( - controller: _pageController, - itemCount: widget.appBody.length, - itemBuilder: (context, index) { - return widget.appBody[index]; - }, - onPageChanged: (index) { - setState(() { - widget.selectedbodyIndex = index; - widget.onIndexChange(widget.selectedbodyIndex); - }); - }, + const SizedBox( + width: 5, + ), + widget.appTools, + ], ), - ), - ], + const SizedBox(height: 5), + Expanded( + child: PageView.builder( + controller: _pageController, + itemCount: widget.appBody.length, + itemBuilder: (context, index) { + return widget.appBody[index]; + }, + onPageChanged: (index) { + setState(() { + widget.selectedbodyIndex = index; + widget.onIndexChange(widget.selectedbodyIndex); + }); + }, + ), + ), + ], + ), ), ), ), diff --git a/Frontend/lib/mih_components/mih_package_components/mih_scack_bar.dart b/Frontend/lib/mih_components/mih_package_components/mih_scack_bar.dart new file mode 100644 index 00000000..4a38e860 --- /dev/null +++ b/Frontend/lib/mih_components/mih_package_components/mih_scack_bar.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +SnackBar MihSnackBar({ + required Widget child, +}) { + return SnackBar( + content: child, + shape: StadiumBorder(), + behavior: SnackBarBehavior.floating, + duration: Duration(seconds: 2), + width: null, + action: SnackBarAction( + label: "Dismiss", + onPressed: () {}, + ), + // elevation: 30, + ); +}