【发布时间】:2022-08-15 13:19:22
【问题描述】:
我正在将 GoRouter 集成到我已经在使用 Riverpod 的 Flutter 应用程序中。我有一个isAuthorizedProvider 定义如下:
final isAuthorizedProvider = Provider<bool>((ref) {
final authStateChanged = ref.watch(_authStateChangedProvider);
final user = authStateChanged.asData?.value;
return user != null;
});
而且我不确定如何定义一个依赖于上面Provider的GoRouter。我想出了以下几点:
final goRouterProvider = Provider<GoRouter>((ref) => GoRouter(
debugLogDiagnostics: true,
redirect: (state) {
final isAuthorized = ref.watch(isAuthorizedProvider);
final isSigningIn = state.subloc == state.namedLocation(\'sign_in\');
if (!isAuthorized) {
return isSigningIn ? null : state.namedLocation(\'sign_in\');
}
// if the user is logged in but still on the login page, send them to
// the home page
if (isSigningIn) return \'/\';
// no need to redirect at all
return null;
},
routes: [
GoRoute(
path: \'/\',
...,
),
GoRoute(
name: \'sign_in\',
path: \'/sign_in\',
...,
),
GoRoute(
name: \'main\',
path: \'/main\',
...,
),
...
],
));
class MyApp extends ConsumerWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
final goRouter = ref.watch(goRouterProvider);
return MaterialApp.router(
routeInformationParser: goRouter.routeInformationParser,
routerDelegate: goRouter.routerDelegate,
);
}
这是正确的方法吗?
-
似乎是对的,因为我在运行时获得了一条路线并导航到它工作正常,所以这也应该有效。(我不完全确定,因为我只更改了一次路线)。如果这不会给您带来编译时错误,那么如果您没有信心,您应该在运行时进行广泛测试:)
标签: flutter dart riverpod gorouter