簡體   English   中英

使用 go_router 傳遞 Auth 數據

[英]passing Auth data with go_router

在我的項目中,我實現了 Provider 方法來管理狀態,我想與 go router 包共享身份驗證提供者信息以保持用戶登錄

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          ChangeNotifierProvider(
            create: (ctx) => Auth(),
          ),
         ListenableProxyProvider<Auth, AppRouter>(
            update: (_, authObj, prevOrders) =>
               AppRouter(authObj)
          ),
}

在我的 AppRouter 類中,我有一個構造函數來獲取身份驗證數據:

class AppRouter with ChangeNotifier {
  final Auth authData;
  AppRouter(this.authData);
  final router = GoRouter(
    initialLocation: '/',
    routes: [

     
      GoRoute(
        name: root,
        path: '/',
        builder: (context, state) => TabsScreen(),
        // redirect: (state) => state.namedLocation(authScreen),
      ),
      GoRoute(
        name: mainScreen,
        path: '/main-screen',
        builder: (context, state) => HomeScreen(),
      ),
      GoRoute(
        name: authscreen,
        path: '/auth-screen',
        builder: (context, state) => AuthScreen(),
      ),

],

    redirect: (state) {
      final loginLoc = state.namedLocation(authScreen);
      final loggingIn = state.subloc == loginLoc;

  var loggedIn = authData.isLoggedIn;
 if (!loggedIn && !loggingIn) return loginLoc;
  if (loggedIn && (loggingIn)) return root;

      return null;
    },

但是我無法在我的班級中訪問 authData 並且我收到此錯誤:

The instance member 'authData' can't be accessed in an initializer.
Try replacing the reference to the instance member with a different expression

這個是正常的。 即使你在想:“當我分配我的 authData 時,重定向就會發生” Dart 不會這樣看。 對於 dart,您試圖在創建路由器的那一刻使用 authData 的值,因此它沒有被分配。 例如,如果 authData 是一個靜態字段並且它已經被分配,您可以這樣做。

您可能可以通過閱讀以下內容來實現您想要實現的目標: https ://gorouter.dev/parameters

編輯:這是我會做的代碼片段:

final router = GoRouter(
    initialLocation: '/',
    routes: [
      GoRoute(
        name: root,
        path: '/',
        builder: (context, state) => TabsScreen(),
      ),
      GoRoute(
        name: mainScreen,
        path: '/main-screen',
        builder: (context, state) => HomeScreen(),
      ),
      GoRoute(
        name: authscreen,
        path: '/auth-screen',
        builder: (context, state) => AuthScreen(),
      ),

    ],

    redirect: (state) {
      final Auth data=state.extra! as Auth;
      final loginLoc = state.namedLocation(authScreen);
      final loggingIn = state.subloc == loginLoc;

      var loggedIn = data.isLoggedIn;
      if (!loggedIn && !loggingIn) return loginLoc;
      if (loggedIn && (loggingIn)) return root;

      return null;
    },
);

注意:請記住始終像這樣傳遞狀態:

context.go('/route', extra:authData);

這篇文章幫助我解決了我的問題,還有關於使用 Go_Router 實現 Navigation 2.0 的完整指南:

Flutter Navigator 2.0:使用 go_router

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM