我尝试在我的GoRouter中实现重定向,这样如果它发现用户没有通过身份验证,它会将他们定向到登录页面,否则按原样处理。
当用户需要重定向到登录时,我的实现工作正常,但是当用户成功登录并且重定向方法成功运行并读取新的登录状态时,我的UI不会重定向到在重定向到登录之前导航到的原始路径。
下面是我的实现。
final routerProvider = Provider<GoRouter>((ref) {
return GoRouter(
initialLocation: Routes.home.toPath(),
refreshListenable: ref.read(authenticationListener),
redirect: (context, state) {
final authState = ref.read(authenticationListener).value;
final isAuthenticated = authState != null;
final isRegistering =
state.subloc == p.join(Routes.login.toPath(), Routes.signUp.toPath());
Routes.signUp.toPath();
final isLoggingIn = state.subloc == Routes.login.toPath();
if (!isAuthenticated && (isRegistering || isLoggingIn)) return null;
if (authState == null) return Routes.login.toPath();
return null;
},
routes: [
GoRoute(
path: Routes.login.toPath(),
name: Routes.login.name,
builder: (context, state) => const Login(),
routes: [
GoRoute(
path: Routes.signUp.toPath(),
name: Routes.signUp.name,
builder: (context, state) => const SignUp(),
)
]),
GoRoute(
path: Routes.home.toPath(),
name: Routes.home.name,
builder: (context, state) => const Home(),
),
],
);
});
以下是我的路线。
enum Routes { login, home, signUp }
extension RouteExtension on Routes {
String toPath() {
switch (this) {
case Routes.login:
return '/login';
case Routes.home:
return '/';
case Routes.signUp:
return 'sign-up';
}
}
}
这是我的列表,它包含了一个状态通知器,看起来工作的很好。
final authenticationListener = Provider<ValueNotifier<sp.AuthResponse?>>((ref) {
final notifier = ValueNotifier<sp.AuthResponse?>(null);
ref.listen(AuthenticationController.provider, (previous, next) {
notifier.value = next;
});
return notifier;
});
1条答案
按热度按时间3pmvbmvn1#
为什么你要声明GoRoute作为一个提供者。最好是把global.btw你是如何声明它在主函数