Ref Riverpod 始终为空

问题描述 投票:0回答:2

我正在使用 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());
    }
  }
}
flutter guard riverpod
2个回答
1
投票

使用消费者并将其引用作为您的 authguard 的参数传递

_appRouter = AppRouter(authGuard: AuthGuard(ref: ref));

0
投票

如果您将 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

© www.soinside.com 2019 - 2024. All rights reserved.