我正在使用 Riverpod 进行状态管理。我还使用 AutoRoute AuthGuard 来保护路由。所以,我需要使用状态来检查用户是否登录。
我不知道我可以在这里初始化 Ref 吗?
或者有更好的选择吗?
这是我的代码。
我想像这样在 AuthGuard 中使用它。
class AuthGuard extends AutoRouteGuard {
final Ref? ref;
@override
void onNavigation(NavigationResolver resolver, StackRouter router) {
** //this ref is null and cause app crash.**
if (ref.read(appProvider).isLoggedIn) {
resolver.next(true);
} else {
Toastr.showWarning(text: 'Access Denied, please login to continue.');
router.push(LoginRoute());
}
}
}
使用消费者并将其引用作为您的 authguard 的参数传递
_appRouter = AppRouter(authGuard: AuthGuard(ref: ref));
如果您将 AutoRoute 更新到最新版本,则此实现可能会遇到一些问题。我之前有一个应用程序,其中使用的是早期版本的 AutoRoute,您可以传递路径防护的类型。但是,从最新的 AutoRoute v6 开始,路由器配置有所不同。您可以访问 RouteGuard 内部的 ref,但是当您实例化路由器时,您必须使用 widgetRef 传递 Routeguard。
所以你的路由器声明:
final appRouter = Router(AuthRouteGuard(ref: ref));
然后你的路由器配置将如下所示:
Router extends _$Router {
Router(this.authRouteGuard);
final AuthRouteGuard authRouteGuard;
然后您需要稍后初始化您的路由以将守卫设置为 authRouteGuard。
late List<AutoRoute> routes = [AutoRoute(...guards:[authRouteGuard])];
在这里,我发现我的解决方案是 AutoRoute Repo 上的一个已解决问题:https://github.com/Milad-Akarie/auto_route_library/issues/1469