I am a beginner in mobile development using Flutter, and I want to set up role-based routing for my app by creating a separate routing file in Dart. My app uses JWT authentication, and the token is already stored locally. However, this is my first time implementing role-based access, and I am not sure how to proceed.
How can I set up role-based routing in Flutter based on the user's role from the JWT token? Any guidance or examples would be greatly appreciated!
here is how i have been managing the routing for the app :
import 'package:flutter/material.dart';
import 'package:stockhive_mobile/screen/admin/departements/Departmentad.dart';
import 'package:stockhive_mobile/screen/admin/users/adduser.dart';
import 'package:stockhive_mobile/screen/auth/introduction_page.dart';
import 'package:stockhive_mobile/screen/auth/login_page.dart';
import 'package:stockhive_mobile/screen/auth/resetpassword.dart';
import 'package:stockhive_mobile/screen/auth/otp.dart';
import 'package:stockhive_mobile/screen/auth/newpassword.dart';
import 'package:stockhive_mobile/screen/auth/editprofile.dart';
import 'package:stockhive_mobile/screen/auth/onboarding.dart';
import 'package:stockhive_mobile/screen/auth/viewprofile.dart';
import 'package:stockhive_mobile/splash/splash_screen.dart';
import '../admin/departements/adddepartementscreen.dart';
import '../admin/users/userscreen.dart';
import 'AdminRoutes.dart'; // Import Admin Routes
import 'collaborator_routes.dart'; // Import Collaborator Routes
import 'package:jwt_decoder/jwt_decoder.dart';
class AppRouter {
static const String introRoute = '/intro';
static const String loginRoute = '/login';
static const String onboardingRoute = '/onboarding';
static const String resetPasswordRoute = '/forgetpassword';
static const String otpRoute = '/otp';
static const String newPasswordRoute = '/newpassword';
static const String editProfileRoute = '/editprofile';
static const String viewProfileRoute = '/viewprofile';
static const String usersRoute = '/usersad';
static const String adduserRoute = '/adduser';
static const String departmentsRoute = '/department';
static const String adddepartmentRoute = '/adddepartment';
static const String infodepartmentRoute = '/infodepartment';
static const String materielsRoute = '/materiel';
static const String addmaterielRoute = '/addmateriel';
/*static const String infomaterielRoute = '/infomateriel';
static const String dashboardRoute = '/dashboard';*/
static const String splashRoute = '/splash';
static Route<dynamic> generateRoute(RouteSettings settings) {
print('🔍 Navigation vers : ${settings.name} avec arguments : ${settings.arguments}');
switch (settings.name) {
case introRoute:
return MaterialPageRoute(builder: (_) => Introduction_page());
case onboardingRoute:
return MaterialPageRoute(builder: (_) => IntroScreen());
case resetPasswordRoute:
return MaterialPageRoute(builder: (_) => ResetPassword());
case otpRoute:
if (settings.arguments is String) {
return MaterialPageRoute(
builder: (_) => OtpScreen(email: settings.arguments as String));
}
return _errorRoute();
case newPasswordRoute:
if (settings.arguments is Map<String, String>) {
final args = settings.arguments as Map<String, String>;
return MaterialPageRoute(
builder: (_) => Newpassword(email: args['email']!, otp: args['otp']!));
}
return _errorRoute();
case splashRoute:
return MaterialPageRoute(builder: (_) => const SplashScreen());
case loginRoute:
return MaterialPageRoute(builder: (_) => LoginPage());
case editProfileRoute:
if (settings.arguments is Map<String, dynamic>) {
return MaterialPageRoute(
builder: (_) => EditProfilePage(userData: settings.arguments as Map<String, dynamic>));
}
return _errorRoute();
case viewProfileRoute:
return MaterialPageRoute(builder: (_) => ViewProfilePage());
case usersRoute:
return MaterialPageRoute(builder: (_) => UsersManagementPage());
case adduserRoute:
return MaterialPageRoute(builder: (_) => AddUser());
case departmentsRoute:
return MaterialPageRoute(builder: (_) => DepartmentManagementPage());
case adddepartmentRoute:
return MaterialPageRoute(builder: (_) => AddDepartment());
default:
return _errorRoute();
}
}
static Route<dynamic> _errorRoute() {
print('❌ Erreur de navigation : Route non trouvée');
return MaterialPageRoute(
builder: (_) => Scaffold(
appBar: AppBar(title: Text("Page introuvable")),
body: Center(child: Text("Erreur 404 - Page introuvable")),
),
);
}
}