bleiddze
bleiddze

Reputation: 1

Proper way of implementing Auth Guard in Flutter App with auto_route

Well, in my application it uses riverpod and autoroute and unfortunately I have a problem with guard here. I would like my app to display DashboardPage if isAuthenticated == true and WelcomePage otherwise. Unfortunately, after I try to log out and redirect to SignInPage by some miracle my guard gets trigged for DashboardPage as a result instead of redirecting me to SignIn it gets redirected to Welcome (because at that time isAuthenticated = false). What am I doing wrong?

AppRouter class

AppRouter appRouter(AppRouterRef ref) => AppRouter(ref);

@AutoRouterConfig()
class AppRouter extends RootStackRouter {
  final Ref ref;

  AppRouter(this.ref);

  @override
  List<AutoRoute> get routes => [
        AutoRoute(page: DashboardRoute.page, initial: true, guards: [AuthGuard(ref)]),
        AutoRoute(page: TempRoute.page),
        AutoRoute(page: WelcomeRoute.page),
        AutoRoute(page: SignInRoute.page),
        AutoRoute(page: SignUpRoute.page),
        AutoRoute(page: ForgotPasswordRoute.page),
        AutoRoute(page: SuccessfulPasswordResetRequestRoute.page),
        AutoRoute(page: NewPasswordRoute.page),
        AutoRoute(page: ProfileRoute.page, guards: [AuthGuard(ref)]),
        AutoRoute(page: QuizzCreationRoute.page, guards: [AuthGuard(ref)]),
        AutoRoute(page: QuizzDetailsRoute.page, guards: [AuthGuard(ref)]),
      ];
}

AuthGuard class

class AuthGuard extends AutoRouteGuard {
  final Ref ref;

  AuthGuard(this.ref);

  @override
  void onNavigation(NavigationResolver resolver, StackRouter router) async {
    final isAuthenticated = await ref.read(sessionProvider).isAuthenticated();
    print('Guard triggered for route: ${resolver.route.name}');
    print('isAuthenticated: $isAuthenticated');
    if (isAuthenticated) {
      resolver.next(true);
    } else {
      resolver.redirect(const WelcomeRoute());
    }
  }
}

And anytime i want redirect to SignInPage or any other like this:

if (state == const AuthState.success()) {
        context.router.replaceAll([const SignInRoute()]);
      }

It triggers somehow AuthGuard

flutter: Guard triggered for route: DashboardRoute
flutter: isAuthenticated: true
flutter: Guard triggered for route: ProfileRoute
flutter: isAuthenticated: true
flutter: Guard triggered for route: DashboardRoute
flutter: isAuthenticated: false

And redirects me to WelcomePage

Upvotes: 0

Views: 211

Answers (0)

Related Questions