import 'package:barcode_scanner/router/go_router_builder.dart' hide $appRoutes; import 'package:barcode_scanner/router/go_secure_router_builder.dart' hide $appRoutes; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; final GlobalKey navigatorKey = GlobalKey(); final navigatorsRouteLocationsProvider = StateProvider>( (ref) => [], ); final routerProvider = Provider( (ref) { // ref.watch(authViewModelProvider); return GoRouter( debugLogDiagnostics: true, routes: [...appRoutes, ...appSecureRoutes], observers: [AppNavigatorObserver(ref: ref)], navigatorKey: navigatorKey, initialLocation: const HomeRoute().location, errorBuilder: (context, state) { // using a post frame callback to perform the navigation after // the build frame has finished WidgetsBinding.instance.addPostFrameCallback((timeStamp) { const NotFoundRoute().go(context); }); return const SizedBox.shrink(); }, ); }, dependencies: [ // authViewModelProvider, ], ); class AppNavigatorObserver extends NavigatorObserver { AppNavigatorObserver({required this.ref}); final Ref ref; @override void didPush(Route route, Route? previousRoute) { super.didPush(route, previousRoute); _visitPage(route.settings.name); } @override void didPop(Route route, Route? previousRoute) { super.didPop(route, previousRoute); _visitPage(previousRoute?.settings.name); } void _visitPage(String? location) { if (location != null) { if (location.startsWith('/')) { Future.microtask( () => ref.read(navigatorsRouteLocationsProvider.notifier).update(( state, ) { final list = state..add(location); return list.toList(); }), ); } } } } CustomTransitionPage buildPageWithDefaultTransition({ required BuildContext context, required GoRouterState state, required Widget child, }) { return CustomTransitionPage( key: state.pageKey, child: child, transitionsBuilder: (context, animation, secondaryAnimation, child) => FadeTransition(opacity: animation, child: child), ); }