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