modular icon indicating copy to clipboard operation
modular copied to clipboard

flutter_modular: ^5.0.3. return GuardedRouteException or RouteNotFoundException

Open sahildev001 opened this issue 3 years ago • 2 comments

I try to navigate from recruiter to recruiter/task inside the Children of recruiter ModuleRoute.

Here I want to Open TaskPage on RouterOutlet.

Package Used

flutter_modular: ^5.0.3

Routes list ---

@override
List<ModularRoute> get routes => [
  ChildRoute('/', child: (context, args) => RecruiterLandingPage(),
      children: [
        ChildRoute('/tasks',
          child: (context, args) =>TasksPage(),
          transition: TransitionType.noTransition,

        ),
    ];

RecruiterLandingPage

I use :

Modular.to.navigate('/tasks');

It returns Exception

Error: RouteNotFoundException: Route (/tasks) not found
           dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 266:49                    throw_
           packages/flutter_modular/src/presenter/navigation/modular_route_information_parser.dart 111:9   <fn>
           dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54                              runBody
           dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 123:5                              _async
           packages/flutter_modular/src/presenter/navigation/modular_route_information_parser.dart 109:56  <fn>
           packages/flutter_modular/src/shared/either.dart 46:18                                           fold
           packages/flutter_modular/src/presenter/navigation/modular_route_information_parser.dart 109:24  selectRoute
           dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 45:50                              <fn>
           dart-sdk/lib/async/zone.dart 1653:54                                                            runUnary
           dart-sdk/lib/async/future_impl.dart 147:18                                                      handleValue
           dart-sdk/lib/async/future_impl.dart 766:44                                                      handleValueCallback
           dart-sdk/lib/async/future_impl.dart 795:13                                                      _propagateToListeners
           dart-sdk/lib/async/future_impl.dart 566:5                                                       [_completeWithValue]
           dart-sdk/lib/async/future_impl.dart 639:7                                                       callback
           dart-sdk/lib/async/schedule_microtask.dart 40:11                                                _microtaskLoop
           dart-sdk/lib/async/schedule_microtask.dart 49:5                                                 _startMicrotaskLoop
           dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 166:15                             <fn>

and When I Use :

Modular.to.navigate('/recruiter/tasks');

It returns Exception

Error: GuardedRouteException: /recruiter/
           dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 266:49  throw_
           packages/flutter_modular/src/presenter/guards/route_guard.dart 31:5           pos
           dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 45:50            <fn>
           dart-sdk/lib/async/zone.dart 1653:54                                          runUnary
           dart-sdk/lib/async/future_impl.dart 147:18                                    handleValue
           dart-sdk/lib/async/future_impl.dart 766:44                                    handleValueCallback
           dart-sdk/lib/async/future_impl.dart 795:13                                    _propagateToListeners
           dart-sdk/lib/async/future_impl.dart 566:5                                     [_completeWithValue]
           dart-sdk/lib/async/future_impl.dart 639:7                                     callback
           dart-sdk/lib/async/schedule_microtask.dart 40:11                              _microtaskLoop
           dart-sdk/lib/async/schedule_microtask.dart 49:5                               _startMicrotaskLoop
           dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 166:15           <fn>

recruiter Route Open by using :

ModuleRoute("/recruiter", module: RecruiterModule(),
    guards: [AuthGuard(), Modular.get<RoleGuardVerify>().getGuard(RoleGuardVerify.RECRUITER)]
),

Authguard

import 'package:/authentication/ui/bloc/user_status/user_status_bloc.dart';
import 'package:flutter_modular/flutter_modular.dart';

class AuthGuard extends RouteGuard {
  AuthGuard() : super();

  @override
  Future<bool> canActivate(String path, ModularRoute router) async {
    var bloc = Modular.get<UserStatusBloc>();
    bloc.add(UserStatusLoadStarted());
   
    return bloc.state is UserStatusLogin;
  }
}

RoleGuardVerify

import 'package:---/app/role_guard.dart';
import 'package:----/authentication/ui/bloc/user_status/user_status_bloc.dart';
import 'package:flutter_modular/flutter_modular.dart';

class RoleGuardVerify {
  static final int RECRUITER = 1;
  static final int CONSULTANT = 2;
  static final int MANAGER = 3;

  Map<int, String> redirectByRole = {
    RECRUITER: "/recruiter",
    CONSULTANT: "/consultant",
    MANAGER: "/manager"
  };

  RouteGuard getGuard(int guardRoleType) {
    try {
      var bloc = Modular.get<UserStatusBloc>();
      if (!(bloc.state is UserStatusLogin)) {
        return RoleGuard(guardRoleType, "/login");
      }
      var user = (bloc.state as UserStatusLogin).user;
      var redirect = redirectByRole[user.role];
      if(redirect != null) {
     
        return RoleGuard(guardRoleType, redirect);
      }else{
        return RoleGuard(guardRoleType, '/recruiter');
      }
    } catch (e) {
   
      return RoleGuard(guardRoleType, "/login");
    }
  }
}

In my opinion, The Guards I created are not returning GuardedRouteException. I want the right way to do navigation.

I used the link(https://modular.flutterando.com.br/docs/flutter_modular/navegation) for this navigation.

sahildev001 avatar Dec 17 '22 16:12 sahildev001

class AuthGuard extends RouteGuard { AuthGuard() : super(redirectTo: '/login); <------------------ improve this line

@override Future canActivate(String path, ModularRoute router) async { var bloc = Modular.get<UserStatusBloc>(); bloc.add(UserStatusLoadStarted());

return bloc.state is UserStatusLogin;

} }

aitinsan avatar Feb 07 '23 02:02 aitinsan

@aitinsan thanks for your response. but I still get the same error. I think the issue is with "RouterOutlet()"

//Here I declare the route for recruiter module 
  ChildRoute('/', child: (context, args) => RecruiterLandingPage(),
        children: [
          ChildRoute('/tasks',
            child: (context, args) =>TasksPage(),
            transition: TransitionType.noTransition,

          ),

And I access this in RouterOutlet().

sahildev001 avatar Mar 12 '23 10:03 sahildev001