import 'package:flutter/material.dart'; import 'package:penguin_flutter_sample/routes/routes.dart'; import 'package:penguin_flutter_sample/ui/home/home_page.dart'; class AppRouter { const AppRouter._(); static final GlobalKey navigatorKey = GlobalKey(); /// The name of the route that loads on app startup static const String initialRoute = Routes.splashScreen; static Route? generateRoute(RouteSettings settings) { switch (settings.name) { case Routes.splashScreen: return _setPage( page: const HomePage(), settings: settings, ); default: return _errorRoute(); } } static Route _errorRoute() { return MaterialPageRoute( builder: (_) => Scaffold( appBar: AppBar( title: const Text('Unknown Route'), ), body: const Center( child: Text('Unknown Route'), ), ), ); } static MaterialPageRoute _setPage({ required Widget page, required RouteSettings settings, }) { return MaterialPageRoute( builder: (_) => page, settings: settings, ); } static Future pushNamed(String routeName, {dynamic args}) { return navigatorKey.currentState!.pushNamed(routeName, arguments: args); } static Future pushNamedAndRemoveUntil( String routeName, String untilRoute, { dynamic args, }) { return navigatorKey.currentState!.pushNamedAndRemoveUntil( routeName, ModalRoute.withName(untilRoute), arguments: args, ); } static Future pushReplacement(String routeName, {dynamic args}) { return navigatorKey.currentState!.pushReplacementNamed(routeName, arguments: args); } static Future popAndPushNamed(String routeName, {dynamic args}) { return navigatorKey.currentState!.popAndPushNamed(routeName, arguments: args); } static Future popAndPushNamedWithTransition( String routeName, { dynamic args, }) { return navigatorKey.currentState!.popAndPushNamed(routeName, arguments: args); } static Future pop([dynamic result]) async { navigatorKey.currentState!.pop(result); } static void popUntil(String routeName) { navigatorKey.currentState!.popUntil(ModalRoute.withName(routeName)); } static void popUntilRoot() { navigatorKey.currentState!.popUntil(ModalRoute.withName(initialRoute)); } static Future startNewRoute(String routeName, {dynamic args}) { return navigatorKey.currentState!.pushNamedAndRemoveUntil( routeName, (Route route) => false, arguments: args, ); } }