mirror of
https://github.com/lucavenir/go_router_riverpod.git
synced 2025-08-06 14:59:53 +08:00
115 lines
2.7 KiB
Dart
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,
|
|
);
|
|
}
|
|
}
|