refactor : base page
This commit is contained in:
@@ -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}');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,98 +6,75 @@ 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(
|
||||||
isFullScreen: true,
|
canPop: false,
|
||||||
child: ObxValue((data) {
|
onPopInvokedWithResult: controller.popBackTaped,
|
||||||
return Stack(
|
child: ChickenBasePage(
|
||||||
children: [
|
isFullScreen: true,
|
||||||
IndexedStack(
|
child: ObxValue((data) {
|
||||||
children: [
|
return Stack(
|
||||||
Navigator(
|
children: [
|
||||||
key: Get.nestedKey(poultryFirstKey),
|
IndexedStack(children: controller.pages, index: data.value),
|
||||||
onGenerateRoute: (settings) {
|
Positioned(
|
||||||
final page = ChickenPages.pages.firstWhere(
|
right: 0,
|
||||||
(e) => e.name == settings.name,
|
left: 0,
|
||||||
orElse: () => ChickenPages.pages.firstWhere(
|
bottom: 0,
|
||||||
(e) => e.name == ChickenRoutes.actionPoultryScience,
|
child: RBottomNavigation(
|
||||||
),
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
);
|
items: [
|
||||||
|
RBottomNavigationItem(
|
||||||
return buildRouteFromGetPage(page);
|
label: 'عملیات',
|
||||||
},
|
icon: Assets.vec.settingSvg.path,
|
||||||
|
isSelected: controller.currentPage.value == 0,
|
||||||
|
onTap: () {
|
||||||
|
Get.nestedKey(
|
||||||
|
poultrySecondKey,
|
||||||
|
)?.currentState?.popUntil((route) => route.isFirst);
|
||||||
|
Get.nestedKey(
|
||||||
|
poultryFirstKey,
|
||||||
|
)?.currentState?.popUntil((route) => route.isFirst);
|
||||||
|
controller.changePage(0);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
RBottomNavigationItem(
|
||||||
|
label: 'خانه',
|
||||||
|
icon: Assets.vec.homeSvg.path,
|
||||||
|
isSelected: controller.currentPage.value == 1,
|
||||||
|
onTap: () {
|
||||||
|
Get.nestedKey(
|
||||||
|
poultryFirstKey,
|
||||||
|
)?.currentState?.popUntil((route) => route.isFirst);
|
||||||
|
Get.nestedKey(
|
||||||
|
poultryThirdKey,
|
||||||
|
)?.currentState?.popUntil((route) => route.isFirst);
|
||||||
|
controller.changePage(1);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
RBottomNavigationItem(
|
||||||
|
label: 'پروفایل',
|
||||||
|
icon: Assets.vec.profileCircleSvg.path,
|
||||||
|
isSelected: controller.currentPage.value == 2,
|
||||||
|
onTap: () {
|
||||||
|
Get.nestedKey(
|
||||||
|
poultryFirstKey,
|
||||||
|
)?.currentState?.popUntil((route) => route.isFirst);
|
||||||
|
Get.nestedKey(
|
||||||
|
poultrySecondKey,
|
||||||
|
)?.currentState?.popUntil((route) => route.isFirst);
|
||||||
|
controller.changePage(2);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
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(
|
|
||||||
right: 0,
|
|
||||||
left: 0,
|
|
||||||
bottom: 0,
|
|
||||||
child: RBottomNavigation(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
||||||
items: [
|
|
||||||
RBottomNavigationItem(
|
|
||||||
label: 'عملیات',
|
|
||||||
icon: Assets.vec.settingSvg.path,
|
|
||||||
isSelected: controller.currentPage.value == 0,
|
|
||||||
onTap: () {
|
|
||||||
Get.nestedKey(
|
|
||||||
poultrySecondKey,
|
|
||||||
)?.currentState?.popUntil((route) => route.isFirst);
|
|
||||||
Get.nestedKey(
|
|
||||||
poultryFirstKey,
|
|
||||||
)?.currentState?.popUntil((route) => route.isFirst);
|
|
||||||
controller.changePage(0);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
RBottomNavigationItem(
|
|
||||||
label: 'خانه',
|
|
||||||
icon: Assets.vec.homeSvg.path,
|
|
||||||
isSelected: controller.currentPage.value == 1,
|
|
||||||
onTap: () {
|
|
||||||
Get.nestedKey(
|
|
||||||
poultryFirstKey,
|
|
||||||
)?.currentState?.popUntil((route) => route.isFirst);
|
|
||||||
Get.nestedKey(
|
|
||||||
poultryThirdKey,
|
|
||||||
)?.currentState?.popUntil((route) => route.isFirst);
|
|
||||||
controller.changePage(1);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
RBottomNavigationItem(
|
|
||||||
label: 'پروفایل',
|
|
||||||
icon: Assets.vec.profileCircleSvg.path,
|
|
||||||
isSelected: controller.currentPage.value == 2,
|
|
||||||
onTap: () {
|
|
||||||
Get.nestedKey(
|
|
||||||
poultryFirstKey,
|
|
||||||
)?.currentState?.popUntil((route) => route.isFirst);
|
|
||||||
Get.nestedKey(
|
|
||||||
poultrySecondKey,
|
|
||||||
)?.currentState?.popUntil((route) => route.isFirst);
|
|
||||||
controller.changePage(2);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
);
|
||||||
);
|
}, controller.currentPage),
|
||||||
}, controller.currentPage),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()) {
|
? null
|
||||||
Get.back(id: widget.backId!); // پاپ با استفاده از backId
|
: chickenAppBar(
|
||||||
} else {
|
isBase: isBase,
|
||||||
// اگر هیچ صفحهای برای پاپ موجود نیست
|
hasBack: isBase ? false : hasBack,
|
||||||
if (widget.onPopScopTaped != null) {
|
onNewsTap: onNewsTap,
|
||||||
widget.onPopScopTaped!();
|
hasFilter: hasFilter,
|
||||||
} else {
|
hasSearch: hasSearch,
|
||||||
Get.back();
|
hasNews: hasNews,
|
||||||
}
|
backId: backId,
|
||||||
}
|
onBackTap: onBackTap,
|
||||||
} else {
|
hasNotification: hasNotification,
|
||||||
// اگر backId نداشته باشد
|
onNotificationTap: onNotificationTap,
|
||||||
if (widget.onPopScopTaped != null) {
|
onFilterTap: hasFilter ? _onFilterTap : null,
|
||||||
widget.onPopScopTaped!();
|
//onSearchTap: widget.hasSearch ? controller.toggleSearch : null,
|
||||||
} 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
|
|
||||||
: chickenAppBar(
|
|
||||||
isBase: widget.isBase,
|
|
||||||
hasBack: widget.isBase ? false : widget.hasBack,
|
|
||||||
onNewsTap: widget.onNewsTap,
|
|
||||||
hasFilter: widget.hasFilter,
|
|
||||||
hasSearch: widget.hasSearch,
|
|
||||||
hasNews: widget.hasNews,
|
|
||||||
backId: widget.backId,
|
|
||||||
onBackTap: widget.onBackTap,
|
|
||||||
hasNotification: widget.hasNotification,
|
|
||||||
onNotificationTap: widget.onNotificationTap,
|
|
||||||
onFilterTap: widget.hasFilter ? _onFilterTap : null,
|
|
||||||
//onSearchTap: widget.hasSearch ? controller.toggleSearch : null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user