first commit
This commit is contained in:
@@ -0,0 +1,321 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../get_core/get_core.dart';
|
||||
import '../../../get_instance/get_instance.dart';
|
||||
import '../../../get_state_manager/get_state_manager.dart';
|
||||
import '../../../get_utils/get_utils.dart';
|
||||
import '../../get_navigation.dart';
|
||||
|
||||
class GetCupertinoApp extends StatelessWidget {
|
||||
final GlobalKey<NavigatorState>? navigatorKey;
|
||||
|
||||
final Widget? home;
|
||||
final Map<String, WidgetBuilder>? routes;
|
||||
final String? initialRoute;
|
||||
final RouteFactory? onGenerateRoute;
|
||||
final InitialRouteListFactory? onGenerateInitialRoutes;
|
||||
final RouteFactory? onUnknownRoute;
|
||||
final List<NavigatorObserver>? navigatorObservers;
|
||||
final TransitionBuilder? builder;
|
||||
final String title;
|
||||
final GenerateAppTitle? onGenerateTitle;
|
||||
final CustomTransition? customTransition;
|
||||
final Color? color;
|
||||
final Map<String, Map<String, String>>? translationsKeys;
|
||||
final Translations? translations;
|
||||
final TextDirection? textDirection;
|
||||
final Locale? locale;
|
||||
final Locale? fallbackLocale;
|
||||
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates;
|
||||
final LocaleListResolutionCallback? localeListResolutionCallback;
|
||||
final LocaleResolutionCallback? localeResolutionCallback;
|
||||
final Iterable<Locale> supportedLocales;
|
||||
final bool showPerformanceOverlay;
|
||||
final bool checkerboardRasterCacheImages;
|
||||
final bool checkerboardOffscreenLayers;
|
||||
final bool showSemanticsDebugger;
|
||||
final bool debugShowCheckedModeBanner;
|
||||
final Map<LogicalKeySet, Intent>? shortcuts;
|
||||
final ThemeData? highContrastTheme;
|
||||
final ThemeData? highContrastDarkTheme;
|
||||
final Map<Type, Action<Intent>>? actions;
|
||||
final Function(Routing?)? routingCallback;
|
||||
final Transition? defaultTransition;
|
||||
final bool? opaqueRoute;
|
||||
final VoidCallback? onInit;
|
||||
final VoidCallback? onReady;
|
||||
final VoidCallback? onDispose;
|
||||
final bool? enableLog;
|
||||
final LogWriterCallback? logWriterCallback;
|
||||
final bool? popGesture;
|
||||
final SmartManagement smartManagement;
|
||||
final Bindings? initialBinding;
|
||||
final Duration? transitionDuration;
|
||||
final bool? defaultGlobalState;
|
||||
final List<GetPage>? getPages;
|
||||
final GetPage? unknownRoute;
|
||||
final RouteInformationProvider? routeInformationProvider;
|
||||
final RouteInformationParser<Object>? routeInformationParser;
|
||||
final RouterDelegate<Object>? routerDelegate;
|
||||
final BackButtonDispatcher? backButtonDispatcher;
|
||||
final CupertinoThemeData? theme;
|
||||
final bool useInheritedMediaQuery;
|
||||
const GetCupertinoApp({
|
||||
Key? key,
|
||||
this.theme,
|
||||
this.navigatorKey,
|
||||
this.home,
|
||||
Map<String, Widget Function(BuildContext)> this.routes =
|
||||
const <String, WidgetBuilder>{},
|
||||
this.initialRoute,
|
||||
this.onGenerateRoute,
|
||||
this.onGenerateInitialRoutes,
|
||||
this.onUnknownRoute,
|
||||
List<NavigatorObserver> this.navigatorObservers =
|
||||
const <NavigatorObserver>[],
|
||||
this.builder,
|
||||
this.translationsKeys,
|
||||
this.translations,
|
||||
this.textDirection,
|
||||
this.title = '',
|
||||
this.onGenerateTitle,
|
||||
this.color,
|
||||
this.customTransition,
|
||||
this.onInit,
|
||||
this.onDispose,
|
||||
this.locale,
|
||||
this.fallbackLocale,
|
||||
this.localizationsDelegates,
|
||||
this.localeListResolutionCallback,
|
||||
this.localeResolutionCallback,
|
||||
this.supportedLocales = const <Locale>[Locale('en', 'US')],
|
||||
this.showPerformanceOverlay = false,
|
||||
this.checkerboardRasterCacheImages = false,
|
||||
this.checkerboardOffscreenLayers = false,
|
||||
this.showSemanticsDebugger = false,
|
||||
this.debugShowCheckedModeBanner = true,
|
||||
this.shortcuts,
|
||||
this.smartManagement = SmartManagement.full,
|
||||
this.initialBinding,
|
||||
this.useInheritedMediaQuery = false,
|
||||
this.unknownRoute,
|
||||
this.routingCallback,
|
||||
this.defaultTransition,
|
||||
this.onReady,
|
||||
this.getPages,
|
||||
this.opaqueRoute,
|
||||
this.enableLog = kDebugMode,
|
||||
this.logWriterCallback,
|
||||
this.popGesture,
|
||||
this.transitionDuration,
|
||||
this.defaultGlobalState,
|
||||
this.highContrastTheme,
|
||||
this.highContrastDarkTheme,
|
||||
this.actions,
|
||||
}) : routeInformationProvider = null,
|
||||
routeInformationParser = null,
|
||||
routerDelegate = null,
|
||||
backButtonDispatcher = null,
|
||||
super(key: key);
|
||||
|
||||
GetCupertinoApp.router({
|
||||
Key? key,
|
||||
this.theme,
|
||||
this.routeInformationProvider,
|
||||
RouteInformationParser<Object>? routeInformationParser,
|
||||
RouterDelegate<Object>? routerDelegate,
|
||||
this.backButtonDispatcher,
|
||||
this.builder,
|
||||
this.title = '',
|
||||
this.onGenerateTitle,
|
||||
this.useInheritedMediaQuery = false,
|
||||
this.color,
|
||||
this.highContrastTheme,
|
||||
this.highContrastDarkTheme,
|
||||
this.locale,
|
||||
this.localizationsDelegates,
|
||||
this.localeListResolutionCallback,
|
||||
this.localeResolutionCallback,
|
||||
this.supportedLocales = const <Locale>[Locale('en', 'US')],
|
||||
this.showPerformanceOverlay = false,
|
||||
this.checkerboardRasterCacheImages = false,
|
||||
this.checkerboardOffscreenLayers = false,
|
||||
this.showSemanticsDebugger = false,
|
||||
this.debugShowCheckedModeBanner = true,
|
||||
this.shortcuts,
|
||||
this.actions,
|
||||
this.customTransition,
|
||||
this.translationsKeys,
|
||||
this.translations,
|
||||
this.textDirection,
|
||||
this.fallbackLocale,
|
||||
this.routingCallback,
|
||||
this.defaultTransition,
|
||||
this.opaqueRoute,
|
||||
this.onInit,
|
||||
this.onReady,
|
||||
this.onDispose,
|
||||
this.enableLog = kDebugMode,
|
||||
this.logWriterCallback,
|
||||
this.popGesture,
|
||||
this.smartManagement = SmartManagement.full,
|
||||
this.initialBinding,
|
||||
this.transitionDuration,
|
||||
this.defaultGlobalState,
|
||||
this.getPages,
|
||||
this.unknownRoute,
|
||||
}) : routerDelegate = routerDelegate ??= Get.createDelegate(
|
||||
notFoundRoute: unknownRoute,
|
||||
),
|
||||
routeInformationParser =
|
||||
routeInformationParser ??= Get.createInformationParser(
|
||||
initialRoute: getPages?.first.name ?? '/',
|
||||
),
|
||||
navigatorObservers = null,
|
||||
navigatorKey = null,
|
||||
onGenerateRoute = null,
|
||||
home = null,
|
||||
onGenerateInitialRoutes = null,
|
||||
onUnknownRoute = null,
|
||||
routes = null,
|
||||
initialRoute = null,
|
||||
super(key: key) {
|
||||
Get.routerDelegate = routerDelegate;
|
||||
Get.routeInformationParser = routeInformationParser;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => GetBuilder<GetMaterialController>(
|
||||
init: Get.rootController,
|
||||
dispose: (d) {
|
||||
onDispose?.call();
|
||||
},
|
||||
initState: (i) {
|
||||
Get.engine.addPostFrameCallback((timeStamp) {
|
||||
onReady?.call();
|
||||
});
|
||||
if (locale != null) Get.locale = locale;
|
||||
|
||||
if (fallbackLocale != null) Get.fallbackLocale = fallbackLocale;
|
||||
|
||||
if (translations != null) {
|
||||
Get.addTranslations(translations!.keys);
|
||||
} else if (translationsKeys != null) {
|
||||
Get.addTranslations(translationsKeys!);
|
||||
}
|
||||
|
||||
Get.customTransition = customTransition;
|
||||
|
||||
initialBinding?.dependencies();
|
||||
if (getPages != null) {
|
||||
Get.addPages(getPages!);
|
||||
}
|
||||
|
||||
Get.smartManagement = smartManagement;
|
||||
onInit?.call();
|
||||
|
||||
Get.config(
|
||||
enableLog: enableLog ?? Get.isLogEnable,
|
||||
logWriterCallback: logWriterCallback,
|
||||
defaultTransition: defaultTransition ?? Get.defaultTransition,
|
||||
defaultOpaqueRoute: opaqueRoute ?? Get.isOpaqueRouteDefault,
|
||||
defaultPopGesture: popGesture ?? Get.isPopGestureEnable,
|
||||
defaultDurationTransition:
|
||||
transitionDuration ?? Get.defaultTransitionDuration,
|
||||
);
|
||||
},
|
||||
builder: (_) => routerDelegate != null
|
||||
? CupertinoApp.router(
|
||||
routerDelegate: routerDelegate!,
|
||||
routeInformationParser: routeInformationParser!,
|
||||
backButtonDispatcher: backButtonDispatcher,
|
||||
routeInformationProvider: routeInformationProvider,
|
||||
key: _.unikey,
|
||||
theme: theme,
|
||||
builder: defaultBuilder,
|
||||
title: title,
|
||||
onGenerateTitle: onGenerateTitle,
|
||||
color: color,
|
||||
locale: Get.locale ?? locale,
|
||||
localizationsDelegates: localizationsDelegates,
|
||||
localeListResolutionCallback: localeListResolutionCallback,
|
||||
localeResolutionCallback: localeResolutionCallback,
|
||||
supportedLocales: supportedLocales,
|
||||
showPerformanceOverlay: showPerformanceOverlay,
|
||||
checkerboardRasterCacheImages: checkerboardRasterCacheImages,
|
||||
checkerboardOffscreenLayers: checkerboardOffscreenLayers,
|
||||
showSemanticsDebugger: showSemanticsDebugger,
|
||||
debugShowCheckedModeBanner: debugShowCheckedModeBanner,
|
||||
shortcuts: shortcuts,
|
||||
useInheritedMediaQuery: useInheritedMediaQuery,
|
||||
)
|
||||
: CupertinoApp(
|
||||
key: _.unikey,
|
||||
theme: theme,
|
||||
navigatorKey: (navigatorKey == null
|
||||
? Get.key
|
||||
: Get.addKey(navigatorKey!)),
|
||||
home: home,
|
||||
routes: routes ?? const <String, WidgetBuilder>{},
|
||||
initialRoute: initialRoute,
|
||||
onGenerateRoute:
|
||||
(getPages != null ? generator : onGenerateRoute),
|
||||
onGenerateInitialRoutes: (getPages == null || home != null)
|
||||
? onGenerateInitialRoutes
|
||||
: initialRoutesGenerate,
|
||||
onUnknownRoute: onUnknownRoute,
|
||||
navigatorObservers: (navigatorObservers == null
|
||||
? <NavigatorObserver>[
|
||||
GetObserver(routingCallback, Get.routing)
|
||||
]
|
||||
: <NavigatorObserver>[
|
||||
GetObserver(routingCallback, Get.routing)
|
||||
]
|
||||
..addAll(navigatorObservers!)),
|
||||
builder: defaultBuilder,
|
||||
title: title,
|
||||
onGenerateTitle: onGenerateTitle,
|
||||
color: color,
|
||||
locale: Get.locale ?? locale,
|
||||
localizationsDelegates: localizationsDelegates,
|
||||
localeListResolutionCallback: localeListResolutionCallback,
|
||||
localeResolutionCallback: localeResolutionCallback,
|
||||
supportedLocales: supportedLocales,
|
||||
showPerformanceOverlay: showPerformanceOverlay,
|
||||
checkerboardRasterCacheImages: checkerboardRasterCacheImages,
|
||||
checkerboardOffscreenLayers: checkerboardOffscreenLayers,
|
||||
showSemanticsDebugger: showSemanticsDebugger,
|
||||
debugShowCheckedModeBanner: debugShowCheckedModeBanner,
|
||||
shortcuts: shortcuts,
|
||||
useInheritedMediaQuery: useInheritedMediaQuery,
|
||||
// actions: actions,
|
||||
),
|
||||
);
|
||||
|
||||
Widget defaultBuilder(BuildContext context, Widget? child) {
|
||||
return Directionality(
|
||||
textDirection: textDirection ??
|
||||
(rtlLanguages.contains(Get.locale?.languageCode)
|
||||
? TextDirection.rtl
|
||||
: TextDirection.ltr),
|
||||
child: builder == null
|
||||
? (child ?? Material())
|
||||
: builder!(context, child ?? Material()),
|
||||
);
|
||||
}
|
||||
|
||||
Route<dynamic> generator(RouteSettings settings) {
|
||||
return PageRedirect(settings: settings, unknownRoute: unknownRoute).page();
|
||||
}
|
||||
|
||||
List<Route<dynamic>> initialRoutesGenerate(String name) {
|
||||
return [
|
||||
PageRedirect(
|
||||
settings: RouteSettings(name: name),
|
||||
unknownRoute: unknownRoute,
|
||||
).page()
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,351 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../get_core/get_core.dart';
|
||||
import '../../../get_instance/get_instance.dart';
|
||||
import '../../../get_state_manager/get_state_manager.dart';
|
||||
import '../../../get_utils/get_utils.dart';
|
||||
import '../../get_navigation.dart';
|
||||
|
||||
class GetMaterialApp extends StatelessWidget {
|
||||
final GlobalKey<NavigatorState>? navigatorKey;
|
||||
|
||||
final GlobalKey<ScaffoldMessengerState>? scaffoldMessengerKey;
|
||||
final Widget? home;
|
||||
final Map<String, WidgetBuilder>? routes;
|
||||
final String? initialRoute;
|
||||
final RouteFactory? onGenerateRoute;
|
||||
final InitialRouteListFactory? onGenerateInitialRoutes;
|
||||
final RouteFactory? onUnknownRoute;
|
||||
final List<NavigatorObserver>? navigatorObservers;
|
||||
final TransitionBuilder? builder;
|
||||
final String title;
|
||||
final GenerateAppTitle? onGenerateTitle;
|
||||
final ThemeData? theme;
|
||||
final ThemeData? darkTheme;
|
||||
final ThemeMode themeMode;
|
||||
final CustomTransition? customTransition;
|
||||
final Color? color;
|
||||
final Map<String, Map<String, String>>? translationsKeys;
|
||||
final Translations? translations;
|
||||
final TextDirection? textDirection;
|
||||
final Locale? locale;
|
||||
final Locale? fallbackLocale;
|
||||
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates;
|
||||
final LocaleListResolutionCallback? localeListResolutionCallback;
|
||||
final LocaleResolutionCallback? localeResolutionCallback;
|
||||
final Iterable<Locale> supportedLocales;
|
||||
final bool showPerformanceOverlay;
|
||||
final bool checkerboardRasterCacheImages;
|
||||
final bool checkerboardOffscreenLayers;
|
||||
final bool showSemanticsDebugger;
|
||||
final bool debugShowCheckedModeBanner;
|
||||
final Map<LogicalKeySet, Intent>? shortcuts;
|
||||
final ScrollBehavior? scrollBehavior;
|
||||
final ThemeData? highContrastTheme;
|
||||
final ThemeData? highContrastDarkTheme;
|
||||
final Map<Type, Action<Intent>>? actions;
|
||||
final bool debugShowMaterialGrid;
|
||||
final ValueChanged<Routing?>? routingCallback;
|
||||
final Transition? defaultTransition;
|
||||
final bool? opaqueRoute;
|
||||
final VoidCallback? onInit;
|
||||
final VoidCallback? onReady;
|
||||
final VoidCallback? onDispose;
|
||||
final bool? enableLog;
|
||||
final LogWriterCallback? logWriterCallback;
|
||||
final bool? popGesture;
|
||||
final SmartManagement smartManagement;
|
||||
final Bindings? initialBinding;
|
||||
final Duration? transitionDuration;
|
||||
final bool? defaultGlobalState;
|
||||
final List<GetPage>? getPages;
|
||||
final GetPage? unknownRoute;
|
||||
final RouteInformationProvider? routeInformationProvider;
|
||||
final RouteInformationParser<Object>? routeInformationParser;
|
||||
final RouterDelegate<Object>? routerDelegate;
|
||||
final BackButtonDispatcher? backButtonDispatcher;
|
||||
final bool useInheritedMediaQuery;
|
||||
const GetMaterialApp({
|
||||
Key? key,
|
||||
this.navigatorKey,
|
||||
this.scaffoldMessengerKey,
|
||||
this.home,
|
||||
Map<String, Widget Function(BuildContext)> this.routes =
|
||||
const <String, WidgetBuilder>{},
|
||||
this.initialRoute,
|
||||
this.onGenerateRoute,
|
||||
this.onGenerateInitialRoutes,
|
||||
this.onUnknownRoute,
|
||||
this.useInheritedMediaQuery = false,
|
||||
List<NavigatorObserver> this.navigatorObservers =
|
||||
const <NavigatorObserver>[],
|
||||
this.builder,
|
||||
this.textDirection,
|
||||
this.title = '',
|
||||
this.onGenerateTitle,
|
||||
this.color,
|
||||
this.theme,
|
||||
this.darkTheme,
|
||||
this.themeMode = ThemeMode.system,
|
||||
this.locale,
|
||||
this.fallbackLocale,
|
||||
this.localizationsDelegates,
|
||||
this.localeListResolutionCallback,
|
||||
this.localeResolutionCallback,
|
||||
this.supportedLocales = const <Locale>[Locale('en', 'US')],
|
||||
this.debugShowMaterialGrid = false,
|
||||
this.showPerformanceOverlay = false,
|
||||
this.checkerboardRasterCacheImages = false,
|
||||
this.checkerboardOffscreenLayers = false,
|
||||
this.showSemanticsDebugger = false,
|
||||
this.debugShowCheckedModeBanner = true,
|
||||
this.shortcuts,
|
||||
this.scrollBehavior,
|
||||
this.customTransition,
|
||||
this.translationsKeys,
|
||||
this.translations,
|
||||
this.onInit,
|
||||
this.onReady,
|
||||
this.onDispose,
|
||||
this.routingCallback,
|
||||
this.defaultTransition,
|
||||
this.getPages,
|
||||
this.opaqueRoute,
|
||||
this.enableLog = kDebugMode,
|
||||
this.logWriterCallback,
|
||||
this.popGesture,
|
||||
this.transitionDuration,
|
||||
this.defaultGlobalState,
|
||||
this.smartManagement = SmartManagement.full,
|
||||
this.initialBinding,
|
||||
this.unknownRoute,
|
||||
this.highContrastTheme,
|
||||
this.highContrastDarkTheme,
|
||||
this.actions,
|
||||
}) : routeInformationProvider = null,
|
||||
routeInformationParser = null,
|
||||
routerDelegate = null,
|
||||
backButtonDispatcher = null,
|
||||
super(key: key);
|
||||
|
||||
GetMaterialApp.router({
|
||||
Key? key,
|
||||
this.routeInformationProvider,
|
||||
this.scaffoldMessengerKey,
|
||||
RouteInformationParser<Object>? routeInformationParser,
|
||||
RouterDelegate<Object>? routerDelegate,
|
||||
this.backButtonDispatcher,
|
||||
this.builder,
|
||||
this.title = '',
|
||||
this.onGenerateTitle,
|
||||
this.color,
|
||||
this.theme,
|
||||
this.darkTheme,
|
||||
this.useInheritedMediaQuery = false,
|
||||
this.highContrastTheme,
|
||||
this.highContrastDarkTheme,
|
||||
this.themeMode = ThemeMode.system,
|
||||
this.locale,
|
||||
this.localizationsDelegates,
|
||||
this.localeListResolutionCallback,
|
||||
this.localeResolutionCallback,
|
||||
this.supportedLocales = const <Locale>[Locale('en', 'US')],
|
||||
this.debugShowMaterialGrid = false,
|
||||
this.showPerformanceOverlay = false,
|
||||
this.checkerboardRasterCacheImages = false,
|
||||
this.checkerboardOffscreenLayers = false,
|
||||
this.showSemanticsDebugger = false,
|
||||
this.debugShowCheckedModeBanner = true,
|
||||
this.shortcuts,
|
||||
this.scrollBehavior,
|
||||
this.actions,
|
||||
this.customTransition,
|
||||
this.translationsKeys,
|
||||
this.translations,
|
||||
this.textDirection,
|
||||
this.fallbackLocale,
|
||||
this.routingCallback,
|
||||
this.defaultTransition,
|
||||
this.opaqueRoute,
|
||||
this.onInit,
|
||||
this.onReady,
|
||||
this.onDispose,
|
||||
this.enableLog = kDebugMode,
|
||||
this.logWriterCallback,
|
||||
this.popGesture,
|
||||
this.smartManagement = SmartManagement.full,
|
||||
this.initialBinding,
|
||||
this.transitionDuration,
|
||||
this.defaultGlobalState,
|
||||
this.getPages,
|
||||
this.navigatorObservers,
|
||||
this.unknownRoute,
|
||||
}) : routerDelegate = routerDelegate ??= Get.createDelegate(
|
||||
notFoundRoute: unknownRoute,
|
||||
),
|
||||
routeInformationParser =
|
||||
routeInformationParser ??= Get.createInformationParser(
|
||||
initialRoute: getPages?.first.name ?? '/',
|
||||
),
|
||||
//navigatorObservers = null,
|
||||
navigatorKey = null,
|
||||
onGenerateRoute = null,
|
||||
home = null,
|
||||
onGenerateInitialRoutes = null,
|
||||
onUnknownRoute = null,
|
||||
routes = null,
|
||||
initialRoute = null,
|
||||
super(key: key) {
|
||||
Get.routerDelegate = routerDelegate;
|
||||
Get.routeInformationParser = routeInformationParser;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => GetBuilder<GetMaterialController>(
|
||||
init: Get.rootController,
|
||||
dispose: (d) {
|
||||
onDispose?.call();
|
||||
},
|
||||
initState: (i) {
|
||||
Get.engine.addPostFrameCallback((timeStamp) {
|
||||
onReady?.call();
|
||||
});
|
||||
if (locale != null) Get.locale = locale;
|
||||
|
||||
if (fallbackLocale != null) Get.fallbackLocale = fallbackLocale;
|
||||
|
||||
if (translations != null) {
|
||||
Get.addTranslations(translations!.keys);
|
||||
} else if (translationsKeys != null) {
|
||||
Get.addTranslations(translationsKeys!);
|
||||
}
|
||||
|
||||
Get.customTransition = customTransition;
|
||||
|
||||
initialBinding?.dependencies();
|
||||
if (getPages != null) {
|
||||
Get.addPages(getPages!);
|
||||
}
|
||||
|
||||
//Get.setDefaultDelegate(routerDelegate);
|
||||
Get.smartManagement = smartManagement;
|
||||
onInit?.call();
|
||||
|
||||
Get.config(
|
||||
enableLog: enableLog ?? Get.isLogEnable,
|
||||
logWriterCallback: logWriterCallback,
|
||||
defaultTransition: defaultTransition ?? Get.defaultTransition,
|
||||
defaultOpaqueRoute: opaqueRoute ?? Get.isOpaqueRouteDefault,
|
||||
defaultPopGesture: popGesture ?? Get.isPopGestureEnable,
|
||||
defaultDurationTransition:
|
||||
transitionDuration ?? Get.defaultTransitionDuration,
|
||||
);
|
||||
},
|
||||
builder: (_) => routerDelegate != null
|
||||
? MaterialApp.router(
|
||||
routerDelegate: routerDelegate!,
|
||||
routeInformationParser: routeInformationParser!,
|
||||
backButtonDispatcher: backButtonDispatcher,
|
||||
routeInformationProvider: routeInformationProvider,
|
||||
key: _.unikey,
|
||||
builder: defaultBuilder,
|
||||
title: title,
|
||||
onGenerateTitle: onGenerateTitle,
|
||||
color: color,
|
||||
theme: _.theme ?? theme ?? ThemeData.fallback(),
|
||||
darkTheme:
|
||||
_.darkTheme ?? darkTheme ?? theme ?? ThemeData.fallback(),
|
||||
themeMode: _.themeMode ?? themeMode,
|
||||
locale: Get.locale ?? locale,
|
||||
scaffoldMessengerKey:
|
||||
scaffoldMessengerKey ?? _.scaffoldMessengerKey,
|
||||
localizationsDelegates: localizationsDelegates,
|
||||
localeListResolutionCallback: localeListResolutionCallback,
|
||||
localeResolutionCallback: localeResolutionCallback,
|
||||
supportedLocales: supportedLocales,
|
||||
debugShowMaterialGrid: debugShowMaterialGrid,
|
||||
showPerformanceOverlay: showPerformanceOverlay,
|
||||
checkerboardRasterCacheImages: checkerboardRasterCacheImages,
|
||||
checkerboardOffscreenLayers: checkerboardOffscreenLayers,
|
||||
showSemanticsDebugger: showSemanticsDebugger,
|
||||
debugShowCheckedModeBanner: debugShowCheckedModeBanner,
|
||||
shortcuts: shortcuts,
|
||||
scrollBehavior: scrollBehavior,
|
||||
useInheritedMediaQuery: useInheritedMediaQuery,
|
||||
)
|
||||
: MaterialApp(
|
||||
key: _.unikey,
|
||||
navigatorKey: (navigatorKey == null
|
||||
? Get.key
|
||||
: Get.addKey(navigatorKey!)),
|
||||
scaffoldMessengerKey:
|
||||
scaffoldMessengerKey ?? _.scaffoldMessengerKey,
|
||||
home: home,
|
||||
routes: routes ?? const <String, WidgetBuilder>{},
|
||||
initialRoute: initialRoute,
|
||||
onGenerateRoute:
|
||||
(getPages != null ? generator : onGenerateRoute),
|
||||
onGenerateInitialRoutes: (getPages == null || home != null)
|
||||
? onGenerateInitialRoutes
|
||||
: initialRoutesGenerate,
|
||||
onUnknownRoute: onUnknownRoute,
|
||||
navigatorObservers: (navigatorObservers == null
|
||||
? <NavigatorObserver>[
|
||||
GetObserver(routingCallback, Get.routing)
|
||||
]
|
||||
: <NavigatorObserver>[
|
||||
GetObserver(routingCallback, Get.routing)
|
||||
]
|
||||
..addAll(navigatorObservers!)),
|
||||
builder: defaultBuilder,
|
||||
title: title,
|
||||
onGenerateTitle: onGenerateTitle,
|
||||
color: color,
|
||||
theme: _.theme ?? theme ?? ThemeData.fallback(),
|
||||
darkTheme:
|
||||
_.darkTheme ?? darkTheme ?? theme ?? ThemeData.fallback(),
|
||||
themeMode: _.themeMode ?? themeMode,
|
||||
locale: Get.locale ?? locale,
|
||||
localizationsDelegates: localizationsDelegates,
|
||||
localeListResolutionCallback: localeListResolutionCallback,
|
||||
localeResolutionCallback: localeResolutionCallback,
|
||||
supportedLocales: supportedLocales,
|
||||
debugShowMaterialGrid: debugShowMaterialGrid,
|
||||
showPerformanceOverlay: showPerformanceOverlay,
|
||||
checkerboardRasterCacheImages: checkerboardRasterCacheImages,
|
||||
checkerboardOffscreenLayers: checkerboardOffscreenLayers,
|
||||
showSemanticsDebugger: showSemanticsDebugger,
|
||||
debugShowCheckedModeBanner: debugShowCheckedModeBanner,
|
||||
shortcuts: shortcuts,
|
||||
scrollBehavior: scrollBehavior,
|
||||
useInheritedMediaQuery: useInheritedMediaQuery,
|
||||
// actions: actions,
|
||||
),
|
||||
);
|
||||
|
||||
Widget defaultBuilder(BuildContext context, Widget? child) {
|
||||
return Directionality(
|
||||
textDirection: textDirection ??
|
||||
(rtlLanguages.contains(Get.locale?.languageCode)
|
||||
? TextDirection.rtl
|
||||
: TextDirection.ltr),
|
||||
child: builder == null
|
||||
? (child ?? Material())
|
||||
: builder!(context, child ?? Material()),
|
||||
);
|
||||
}
|
||||
|
||||
Route<dynamic> generator(RouteSettings settings) {
|
||||
return PageRedirect(settings: settings, unknownRoute: unknownRoute).page();
|
||||
}
|
||||
|
||||
List<Route<dynamic>> initialRoutesGenerate(String name) {
|
||||
return [
|
||||
PageRedirect(
|
||||
settings: RouteSettings(name: name),
|
||||
unknownRoute: unknownRoute,
|
||||
).page()
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
const List<String> rtlLanguages = <String>[
|
||||
'ar', // Arabic
|
||||
'fa', // Farsi
|
||||
'he', // Hebrew
|
||||
'ps', // Pashto
|
||||
'ur',
|
||||
];
|
||||
|
||||
abstract class Translations {
|
||||
Map<String, Map<String, String>> get keys;
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
import '../../get_navigation.dart';
|
||||
|
||||
class RouteDecoder {
|
||||
final List<GetPage> treeBranch;
|
||||
GetPage? get route => treeBranch.isEmpty ? null : treeBranch.last;
|
||||
final Map<String, String> parameters;
|
||||
final Object? arguments;
|
||||
const RouteDecoder(
|
||||
this.treeBranch,
|
||||
this.parameters,
|
||||
this.arguments,
|
||||
);
|
||||
void replaceArguments(Object? arguments) {
|
||||
final _route = route;
|
||||
if (_route != null) {
|
||||
final index = treeBranch.indexOf(_route);
|
||||
treeBranch[index] = _route.copy(arguments: arguments);
|
||||
}
|
||||
}
|
||||
|
||||
void replaceParameters(Object? arguments) {
|
||||
final _route = route;
|
||||
if (_route != null) {
|
||||
final index = treeBranch.indexOf(_route);
|
||||
treeBranch[index] = _route.copy(parameters: parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ParseRouteTree {
|
||||
ParseRouteTree({
|
||||
required this.routes,
|
||||
});
|
||||
|
||||
final List<GetPage> routes;
|
||||
|
||||
RouteDecoder matchRoute(String name, {Object? arguments}) {
|
||||
final uri = Uri.parse(name);
|
||||
// /home/profile/123 => home,profile,123 => /,/home,/home/profile,/home/profile/123
|
||||
final split = uri.path.split('/').where((element) => element.isNotEmpty);
|
||||
var curPath = '/';
|
||||
final cumulativePaths = <String>[
|
||||
'/',
|
||||
];
|
||||
for (var item in split) {
|
||||
if (curPath.endsWith('/')) {
|
||||
curPath += '$item';
|
||||
} else {
|
||||
curPath += '/$item';
|
||||
}
|
||||
cumulativePaths.add(curPath);
|
||||
}
|
||||
|
||||
final treeBranch = cumulativePaths
|
||||
.map((e) => MapEntry(e, _findRoute(e)))
|
||||
.where((element) => element.value != null)
|
||||
.map((e) => MapEntry(e.key, e.value!))
|
||||
.toList();
|
||||
|
||||
final params = Map<String, String>.from(uri.queryParameters);
|
||||
if (treeBranch.isNotEmpty) {
|
||||
//route is found, do further parsing to get nested query params
|
||||
final lastRoute = treeBranch.last;
|
||||
final parsedParams = _parseParams(name, lastRoute.value.path);
|
||||
if (parsedParams.isNotEmpty) {
|
||||
params.addAll(parsedParams);
|
||||
}
|
||||
//copy parameters to all pages.
|
||||
final mappedTreeBranch = treeBranch
|
||||
.map(
|
||||
(e) => e.value.copy(
|
||||
parameters: {
|
||||
if (e.value.parameters != null) ...e.value.parameters!,
|
||||
...params,
|
||||
},
|
||||
name: e.key,
|
||||
),
|
||||
)
|
||||
.toList();
|
||||
return RouteDecoder(
|
||||
mappedTreeBranch,
|
||||
params,
|
||||
arguments,
|
||||
);
|
||||
}
|
||||
|
||||
//route not found
|
||||
return RouteDecoder(
|
||||
treeBranch.map((e) => e.value).toList(),
|
||||
params,
|
||||
arguments,
|
||||
);
|
||||
}
|
||||
|
||||
void addRoutes(List<GetPage> getPages) {
|
||||
for (final route in getPages) {
|
||||
addRoute(route);
|
||||
}
|
||||
}
|
||||
|
||||
void addRoute(GetPage route) {
|
||||
routes.add(route);
|
||||
|
||||
// Add Page children.
|
||||
for (var page in _flattenPage(route)) {
|
||||
addRoute(page);
|
||||
}
|
||||
}
|
||||
|
||||
List<GetPage> _flattenPage(GetPage route) {
|
||||
final result = <GetPage>[];
|
||||
if (route.children.isEmpty) {
|
||||
return result;
|
||||
}
|
||||
|
||||
final parentPath = route.name;
|
||||
for (var page in route.children) {
|
||||
// Add Parent middlewares to children
|
||||
final parentMiddlewares = [
|
||||
if (page.middlewares != null) ...page.middlewares!,
|
||||
if (route.middlewares != null) ...route.middlewares!
|
||||
];
|
||||
result.add(
|
||||
_addChild(
|
||||
page,
|
||||
parentPath,
|
||||
parentMiddlewares,
|
||||
),
|
||||
);
|
||||
|
||||
final children = _flattenPage(page);
|
||||
for (var child in children) {
|
||||
result.add(_addChild(
|
||||
child,
|
||||
parentPath,
|
||||
[
|
||||
...parentMiddlewares,
|
||||
if (child.middlewares != null) ...child.middlewares!,
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// Change the Path for a [GetPage]
|
||||
GetPage _addChild(
|
||||
GetPage origin, String parentPath, List<GetMiddleware> middlewares) =>
|
||||
origin.copy(
|
||||
middlewares: middlewares,
|
||||
name: (parentPath + origin.name).replaceAll(r'//', '/'),
|
||||
);
|
||||
|
||||
GetPage? _findRoute(String name) {
|
||||
return routes.firstWhereOrNull(
|
||||
(route) => route.path.regex.hasMatch(name),
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, String> _parseParams(String path, PathDecoded routePath) {
|
||||
final params = <String, String>{};
|
||||
var idx = path.indexOf('?');
|
||||
if (idx > -1) {
|
||||
path = path.substring(0, idx);
|
||||
final uri = Uri.tryParse(path);
|
||||
if (uri != null) {
|
||||
params.addAll(uri.queryParameters);
|
||||
}
|
||||
}
|
||||
var paramsMatch = routePath.regex.firstMatch(path);
|
||||
|
||||
for (var i = 0; i < routePath.keys.length; i++) {
|
||||
var param = Uri.decodeQueryComponent(paramsMatch![i + 1]!);
|
||||
params[routePath.keys[i]!] = param;
|
||||
}
|
||||
return params;
|
||||
}
|
||||
}
|
||||
|
||||
extension FirstWhereExt<T> on List<T> {
|
||||
/// The first element satisfying [test], or `null` if there are none.
|
||||
T? firstWhereOrNull(bool Function(T element) test) {
|
||||
for (var element in this) {
|
||||
if (test(element)) return element;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../get.dart';
|
||||
|
||||
class GetMaterialController extends SuperController {
|
||||
bool testMode = false;
|
||||
Key? unikey;
|
||||
ThemeData? theme;
|
||||
ThemeData? darkTheme;
|
||||
ThemeMode? themeMode;
|
||||
|
||||
final scaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
|
||||
|
||||
bool defaultPopGesture = GetPlatform.isIOS;
|
||||
bool defaultOpaqueRoute = true;
|
||||
|
||||
Transition? defaultTransition;
|
||||
Duration defaultTransitionDuration = Duration(milliseconds: 300);
|
||||
Curve defaultTransitionCurve = Curves.easeOutQuad;
|
||||
|
||||
Curve defaultDialogTransitionCurve = Curves.easeOutQuad;
|
||||
|
||||
Duration defaultDialogTransitionDuration = Duration(milliseconds: 300);
|
||||
|
||||
final routing = Routing();
|
||||
|
||||
Map<String, String?> parameters = {};
|
||||
|
||||
CustomTransition? customTransition;
|
||||
|
||||
var _key = GlobalKey<NavigatorState>(debugLabel: 'Key Created by default');
|
||||
|
||||
Map<dynamic, GlobalKey<NavigatorState>> keys = {};
|
||||
|
||||
GlobalKey<NavigatorState> get key => _key;
|
||||
|
||||
GlobalKey<NavigatorState>? addKey(GlobalKey<NavigatorState> newKey) {
|
||||
_key = newKey;
|
||||
return key;
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeLocales(List<Locale>? locales) {
|
||||
Get.asap(() {
|
||||
final locale = Get.deviceLocale;
|
||||
if (locale != null) {
|
||||
Get.updateLocale(locale);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void onDetached() {}
|
||||
|
||||
@override
|
||||
void onInactive() {}
|
||||
|
||||
@override
|
||||
void onPaused() {}
|
||||
|
||||
@override
|
||||
void onResumed() {}
|
||||
|
||||
void restartApp() {
|
||||
unikey = UniqueKey();
|
||||
update();
|
||||
}
|
||||
|
||||
void setTheme(ThemeData value) {
|
||||
if (darkTheme == null) {
|
||||
theme = value;
|
||||
} else {
|
||||
if (value.brightness == Brightness.light) {
|
||||
theme = value;
|
||||
} else {
|
||||
darkTheme = value;
|
||||
}
|
||||
}
|
||||
update();
|
||||
}
|
||||
|
||||
void setThemeMode(ThemeMode value) {
|
||||
themeMode = value;
|
||||
update();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user