[英]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 的完整指南:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.