import 'dart:async'; import 'package:example/pages/details_page.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import '../pages/admin_page.dart'; import '../pages/guest_page.dart'; import '../pages/home_page.dart'; import '../pages/login_page.dart'; import '../pages/splash_page.dart'; import '../pages/user_page.dart'; import '../state/permissions.dart'; part 'routes.g.dart'; @TypedGoRoute( path: '/', routes: [ TypedGoRoute(path: 'admin'), TypedGoRoute(path: 'user'), TypedGoRoute(path: 'guest'), ], ) class HomeRoute extends GoRouteData { const HomeRoute(); /// Important note on this redirect function: this isn't reactive. /// No redirect will be triggered on a user role change. /// /// This is currently unsupported. @override FutureOr redirect(BuildContext context, GoRouterState state) async { final userRole = await ProviderScope.containerOf(context).read( permissionsProvider.future, ); return userRole.map( admin: (_) => const AdminRoute().location, user: (_) => const UserRoute().location, guest: (_) => const GuestRoute().location, none: (_) => null, ); } @override Widget build(BuildContext context, GoRouterState state) { return const HomePage(); } } @TypedGoRoute(path: '/splash') class SplashRoute extends GoRouteData { const SplashRoute(); @override Widget build(BuildContext context, GoRouterState state) { return const SplashPage(); } } @TypedGoRoute(path: '/login') class LoginRoute extends GoRouteData { const LoginRoute(); @override Widget build(BuildContext context, GoRouterState state) { return const LoginPage(); } } class AdminRoute extends GoRouteData { const AdminRoute(); @override Widget build(BuildContext context, GoRouterState state) { return const AdminPage(); } } class UserRoute extends GoRouteData { const UserRoute(); @override Widget build(BuildContext context, GoRouterState state) { return const UserPage(); } } class GuestRoute extends GoRouteData { const GuestRoute(); @override Widget build(BuildContext context, GoRouterState state) { return const GuestPage(); } } /// This route shows how to parametrize a simple page and how to pass a simple query parameter. @TypedGoRoute(path: '/details/:id') class DetailsRoute extends GoRouteData { const DetailsRoute(this.id, {this.isNuke = false}); final int id; final bool isNuke; @override Widget build(BuildContext context, GoRouterState state) { return DetailsPage( id, isNuclearCode: isNuke, ); } }