0

I have very simple usecase when user enter the app, I have a route "/" to just redirect it to home if user logged in or-else redirect them to sign in screen. But my implementation works like pushing a route above the "/" route.

Here is my code:

@TypedGoRoute<InitialRouteData>(path: "/")
class InitialRouteData extends GoRouteData {
  const InitialRouteData();
}

@TypedGoRoute<HomeRoute>(path: "/home")
class HomeRoute extends ShellRouteData {
  const HomeRoute();

  @override
  Widget builder(BuildContext context, GoRouterState state, Widget navigator) {
    return HomeView(child: navigator);
  }
}

@TypedGoRoute<SignInRouteData>(path: '/auth/sign-in')
class SignInRouteData extends GoRouteData {
  const SignInRouteData();

  @override
  Widget build(BuildContext context, GoRouterState state) {
    return const SignInView();
  }
}

@TypedGoRoute<SignUpRouteData>(path: '/auth/sign-up')
class SignUpRouteData extends GoRouteData {
  const SignUpRouteData();

  @override
  Widget build(BuildContext context, GoRouterState state) {
    return const SignUpView();
  }
}


@Riverpod(keepAlive: true)
GoRouter appRouter(AppRouterRef ref) {
  final routerNotifier = ref.watch(routerNotifierProvider);
  return GoRouter(
    routes: $appRoutes,
    debugLogDiagnostics: true,
    refreshListenable: routerNotifier,
    redirect: (BuildContext context, GoRouterState state) async {
      final isAuth = await ref.watch(sessionTokenProvider.selectAsync((data) => data != null));

      final isLoggingIn = state.location == const SignInRouteData().location;
      final isSigningUp = state.location == const SignUpRouteData().location;
      final inUnAuthRoute = isLoggingIn || isSigningUp;

      if (!isAuth && !inUnAuthRoute) return const SignInRouteData().location;
      if (isAuth && inUnAuthRoute) return const RecentRouteData().location;
      return null;
    },
  );
}

I'm research about it but don't find any solution for it

Definev
  • 21
  • 1
  • 2

0 Answers0