flutter_modular: ^5.0.3. return GuardedRouteException or RouteNotFoundException
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.
class AuthGuard extends RouteGuard { AuthGuard() : super(redirectTo: '/login); <------------------ improve this line
@override
Future
return bloc.state is UserStatusLogin;
} }
@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().