Files
2023-10-28 18:04:32 +02:00

115 lines
2.7 KiB
Dart

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<HomeRoute>(
path: '/',
routes: [
TypedGoRoute<AdminRoute>(path: 'admin'),
TypedGoRoute<UserRoute>(path: 'user'),
TypedGoRoute<GuestRoute>(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<String?> 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<SplashRoute>(path: '/splash')
class SplashRoute extends GoRouteData {
const SplashRoute();
@override
Widget build(BuildContext context, GoRouterState state) {
return const SplashPage();
}
}
@TypedGoRoute<LoginRoute>(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<DetailsRoute>(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,
);
}
}