refactor : base page

This commit is contained in:
2025-09-27 08:05:26 +03:30
parent 5ac8342bb3
commit a7c7442b49
6 changed files with 149 additions and 199 deletions

View File

@@ -6,20 +6,9 @@ class CustomNavigationObserver extends NavigatorObserver {
@override @override
void didPush(Route route, Route? previousRoute) async { void didPush(Route route, Route? previousRoute) async {
final routeName = route.settings.name; final routeName = route.settings.name;
/* if (!_isWorkDone && (routeName == ChickenRoutes.init || routeName == ChickenRoutes.auth)) {
_isWorkDone = true;
await setupChickenDI();
} else if (!_isWorkDone &&
(routeName == InspectionRoutes.init || routeName == InspectionRoutes.auth)) {
_isWorkDone = true;
await setupInspectionDI();
} else if (!_isWorkDone &&
(routeName == LiveStockRoutes.init || routeName == LiveStockRoutes.auth)) {
}*/
super.didPush(route, previousRoute); super.didPush(route, previousRoute);
// tLog('CustomNavigationObserver: didPush - $routeName'); tLog('CustomNavigationObserver: didPush - $routeName');
} }
@override @override
@@ -31,12 +20,12 @@ class CustomNavigationObserver extends NavigatorObserver {
@override @override
void didPop(Route route, Route? previousRoute) { void didPop(Route route, Route? previousRoute) {
super.didPop(route, previousRoute); super.didPop(route, previousRoute);
// tLog('CustomNavigationObserver: didPop - ${route.settings.name}'); tLog('CustomNavigationObserver: didPop - ${route.settings.name}');
} }
@override @override
void didRemove(Route route, Route? previousRoute) { void didRemove(Route route, Route? previousRoute) {
super.didRemove(route, previousRoute); super.didRemove(route, previousRoute);
// tLog('CustomNavigationObserver: didRemove - ${route.settings.name}'); tLog('CustomNavigationObserver: didRemove - ${route.settings.name}');
} }
} }

View File

@@ -31,6 +31,7 @@ class PoultryActionPage extends GetView<PoultryActionLogic> {
title: item.title, title: item.title,
vecIcon: item.icon, vecIcon: item.icon,
onTap: () async { onTap: () async {
Get.toNamed(item.route, id: poultryFirstKey); Get.toNamed(item.route, id: poultryFirstKey);
}, },
); );

View File

@@ -1,9 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rasadyar_chicken/data/di/chicken_di.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository.dart'; import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository.dart';
import 'package:rasadyar_chicken/presentation/pages/common/profile/view.dart'; import 'package:rasadyar_chicken/presentation/pages/common/profile/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/home/view.dart'; import 'package:rasadyar_chicken/presentation/pages/poultry_science/home/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/poultry_action/view.dart'; import 'package:rasadyar_chicken/presentation/pages/poultry_science/poultry_action/view.dart';
import 'package:rasadyar_chicken/presentation/routes/pages.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart'; import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_chicken/presentation/utils/utils.dart';
import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/core.dart';
@@ -11,15 +14,35 @@ import 'package:rasadyar_core/core.dart';
enum ErrorLocationType { serviceDisabled, permissionDenied, none } enum ErrorLocationType { serviceDisabled, permissionDenied, none }
class PoultryScienceRootLogic extends GetxController { class PoultryScienceRootLogic extends GetxController {
RxInt currentPage = 1.obs;
List<Widget> pages = [PoultryActionPage(), PoultryScienceHomePage(), ProfilePage()];
var tokenService = Get.find<TokenStorageService>(); var tokenService = Get.find<TokenStorageService>();
late PoultryScienceRepository poultryRepository; late PoultryScienceRepository poultryRepository;
RxList<ErrorLocationType> errorLocationType = RxList(); RxList<ErrorLocationType> errorLocationType = RxList();
RxMap<int, dynamic> homeExpandedList = RxMap(); RxMap<int, dynamic> homeExpandedList = RxMap();
DateTime? _lastBackPressed;
RxInt currentPage = 1.obs;
final pages = [
Navigator(
key: Get.nestedKey(poultryFirstKey),
onGenerateRoute: (settings) {
final page = ChickenPages.pages.firstWhere(
(e) => e.name == settings.name,
orElse: () => ChickenPages.pages.firstWhere(
(e) => e.name == ChickenRoutes.actionPoultryScience,
),
);
return buildRouteFromGetPage(page);
},
),
PoultryScienceHomePage(),
ProfilePage(),
];
@override @override
void onInit() { void onInit() {
@@ -62,4 +85,28 @@ class PoultryScienceRootLogic extends GetxController {
return poultryFirstKey; return poultryFirstKey;
} }
} }
void popBackTaped(bool didPop, result) async {
final nestedKeyId = getNestedKey();
GlobalKey<NavigatorState>? currentNestedKey = Get.nestedKey(nestedKeyId);
if (currentNestedKey?.currentState?.canPop() == true) {
Get.back(id: nestedKeyId);
} else {
final now = DateTime.now();
if (_lastBackPressed == null ||
now.difference(_lastBackPressed!) > Duration(seconds: 2)) {
_lastBackPressed = now;
Get.snackbar(
'خروج از برنامه',
'برای خروج دوباره بازگشت را بزنید',
snackPosition: SnackPosition.TOP,
duration: Duration(seconds: 2),
backgroundColor: AppColor.warning,
);
} else {
await SystemNavigator.pop();
}
}
}
} }

View File

@@ -1,7 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rasadyar_chicken/presentation/routes/pages.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart'; import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/core.dart';
@@ -9,43 +6,19 @@ import 'package:rasadyar_core/core.dart';
import 'logic.dart'; import 'logic.dart';
class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> { class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
PoultryScienceRootPage({super.key}); const PoultryScienceRootPage({super.key});
DateTime? _lastBackPressed;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ChickenBasePage( return PopScope(
canPop: false,
onPopInvokedWithResult: controller.popBackTaped,
child: ChickenBasePage(
isFullScreen: true, isFullScreen: true,
child: ObxValue((data) { child: ObxValue((data) {
return Stack( return Stack(
children: [ children: [
IndexedStack( IndexedStack(children: controller.pages, index: data.value),
children: [
Navigator(
key: Get.nestedKey(poultryFirstKey),
onGenerateRoute: (settings) {
final page = ChickenPages.pages.firstWhere(
(e) => e.name == settings.name,
orElse: () => ChickenPages.pages.firstWhere(
(e) => e.name == ChickenRoutes.actionPoultryScience,
),
);
return buildRouteFromGetPage(page);
},
),
Navigator(
key: Get.nestedKey(poultrySecondKey),
onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[1]),
),
Navigator(
key: Get.nestedKey(poultryThirdKey),
onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]),
),
],
index: data.value,
),
Positioned( Positioned(
right: 0, right: 0,
left: 0, left: 0,
@@ -101,6 +74,7 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
], ],
); );
}, controller.currentPage), }, controller.currentPage),
),
); );
} }
} }

View File

@@ -3,7 +3,7 @@ import 'package:rasadyar_chicken/presentation/widget/app_bar.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/back_ground.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/back_ground.dart';
import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/core.dart';
class ChickenBasePage extends StatefulWidget { class ChickenBasePage extends GetView<BaseLogic> {
const ChickenBasePage({ const ChickenBasePage({
super.key, super.key,
this.hasBack = true, this.hasBack = true,
@@ -62,44 +62,13 @@ class ChickenBasePage extends StatefulWidget {
final BackGroundWidget? backGroundWidget; final BackGroundWidget? backGroundWidget;
@override
State<ChickenBasePage> createState() => _ChickenBasePageState();
}
class _ChickenBasePageState extends State<ChickenBasePage> {
int? _lastBackId;
@override
void initState() {
super.initState();
_lastBackId = widget.backId;
tLog(_lastBackId);
tLog(widget.backId);
}
@override
void didChangeDependencies() {
fLog('didChangeDependencies');
fLog(_lastBackId);
fLog(widget.backId);
super.didChangeDependencies();
}
@override
void didUpdateWidget(covariant ChickenBasePage oldWidget) {
dLog('didUpdateWidget');
dLog(_lastBackId);
dLog(widget.backId);
super.didUpdateWidget(oldWidget);
}
void _onFilterTap() { void _onFilterTap() {
if (widget.hasFilter && widget.filteringWidget != null) { if (hasFilter && filteringWidget != null) {
final currentRoute = ModalRoute.of(Get.context!); final currentRoute = ModalRoute.of(Get.context!);
if (currentRoute?.isCurrent != true) return; if (currentRoute?.isCurrent != true) return;
Get.bottomSheet( Get.bottomSheet(
widget.filteringWidget!, filteringWidget!,
isScrollControlled: true, isScrollControlled: true,
isDismissible: true, isDismissible: true,
enableDrag: true, enableDrag: true,
@@ -109,61 +78,31 @@ class _ChickenBasePageState extends State<ChickenBasePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return PopScope( return BasePage(
canPop: false, routes: routes,
onPopInvokedWithResult: (didPop, result) { routesWidget: routesWidget,
iLog('PopScope onPopInvokedWithResult:==> ${widget.backId}'); widgets: widgets,
iLog('PopScope onPopInvokedWithResult:==> $_lastBackId}'); child: child,
iLog('PopScope onPopInvokedWithResult:==> ${widget.onPopScopTaped}'); scrollable: scrollable,
iLog('PopScope onPopInvokedWithResult:==> ${widget.onBackTap}'); floatingActionButtonLocation: floatingActionButtonLocation,
// چک کردن و مدیریت برگشت با backId floatingActionButton: floatingActionButton,
if (widget.backId != null) { backGroundWidget: backGroundWidget ?? chickenBackground(),
final navigatorState = Get.nestedKey(widget.backId!)?.currentState; appBar: isFullScreen
if (navigatorState != null && navigatorState.canPop()) {
Get.back(id: widget.backId!); // پاپ با استفاده از backId
} else {
// اگر هیچ صفحه‌ای برای پاپ موجود نیست
if (widget.onPopScopTaped != null) {
widget.onPopScopTaped!();
} else {
Get.back();
}
}
} else {
// اگر backId نداشته باشد
if (widget.onPopScopTaped != null) {
widget.onPopScopTaped!();
} else {
Get.back();
}
}
},
child: BasePage(
routes: widget.routes,
routesWidget: widget.routesWidget,
widgets: widget.widgets,
child: widget.child,
scrollable: widget.scrollable,
floatingActionButtonLocation: widget.floatingActionButtonLocation,
floatingActionButton: widget.floatingActionButton,
backGroundWidget: widget.backGroundWidget ?? chickenBackground(),
appBar: widget.isFullScreen
? null ? null
: chickenAppBar( : chickenAppBar(
isBase: widget.isBase, isBase: isBase,
hasBack: widget.isBase ? false : widget.hasBack, hasBack: isBase ? false : hasBack,
onNewsTap: widget.onNewsTap, onNewsTap: onNewsTap,
hasFilter: widget.hasFilter, hasFilter: hasFilter,
hasSearch: widget.hasSearch, hasSearch: hasSearch,
hasNews: widget.hasNews, hasNews: hasNews,
backId: widget.backId, backId: backId,
onBackTap: widget.onBackTap, onBackTap: onBackTap,
hasNotification: widget.hasNotification, hasNotification: hasNotification,
onNotificationTap: widget.onNotificationTap, onNotificationTap: onNotificationTap,
onFilterTap: widget.hasFilter ? _onFilterTap : null, onFilterTap: hasFilter ? _onFilterTap : null,
//onSearchTap: widget.hasSearch ? controller.toggleSearch : null, //onSearchTap: widget.hasSearch ? controller.toggleSearch : null,
), ),
),
); );
} }
} }

View File

@@ -317,10 +317,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: device_preview_plus name: device_preview_plus
sha256: "2ebe9cf25ed46875c9c1b745d0438df9e4c49f7bcf9ea466c88efbcffcc73ab7" sha256: "45f9154c3213e470df1aa54326757ccf3cc6fb1f04396bced6ad1a7bfc9d6400"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.1" version: "2.5.0"
dio: dio:
dependency: transitive dependency: transitive
description: description:
@@ -1839,4 +1839,4 @@ packages:
version: "2.1.0" version: "2.1.0"
sdks: sdks:
dart: ">=3.9.2 <4.0.0" dart: ">=3.9.2 <4.0.0"
flutter: ">=3.35.4" flutter: ">=3.35.3"