1

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")),
      ),
    );
  }
}
1
  • Could you add a little snipped on how you extract the role information from the token? Commented Apr 2 at 11:46

1 Answer 1

0

Depending on the complexity you could

  • add a second switch statement or
  • put the auth-logic in a seperate function (which could be in seperate part files)

first approach

static Route<dynamic> generateRoute(RouteSettings settings, String role) {
    print('🔍 Navigation vers : ${settings.name} avec arguments : ${settings.arguments}');

    switch (settings.name) {
      case introRoute:
        switch(role) {
          case "admin": 
            return MaterialPageRoute(builder: (_) => AdminIntroductionPage());
          case "user":
            return MaterialPageRoute(builder: (_) => UserIntroductionPage());
          default: 
            return _errorRoute());
      case onboardingRoute:
        ...

second approach

MaterialPageRoute _showIntroductionPage(String role) {
  switch(role) {
    case "admin": 
      return MaterialPageRoute(builder: (_) => AdminIntroductionPage());
    case "user":
      return MaterialPageRoute(builder: (_) => UserIntroductionPage());
    default: 
      return _errorRoute());
}

// add functions for other pages here

static Route<dynamic> generateRoute(RouteSettings settings, String role) {
    print('🔍 Navigation vers : ${settings.name} avec arguments : ${settings.arguments}');

    switch (settings.name) {
      case introRoute:
        return _showIntroductionPage(role);
      case onboardingRoute:
        ...
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.