Flotter Web,Riverpod和Gorouter,如何从Gorouter in访问状态通知器

问题描述 投票:0回答:2
我希望我的应用程序中的用户能够深入链接到配置文件页面,例如,用户可能会访问“ www.myapp.com/#/users/ {userid}”,我希望我的gorouter检测到{ userId}来自URI的变量,然后将数据馈送到状态通知器中,该数据将向该用户获取详细信息。

所以我的代码看起来像这样:

class MyApp extends StatelessWidget { MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp.router( routeInformationProvider: _router.routeInformationProvider, routeInformationParser: _router.routeInformationParser, routerDelegate: _router.routerDelegate, ); } final GoRouter _router = GoRouter( initialLocation: '/login', routes: <GoRoute>[ GoRoute(path: '/', builder: (context, state) => LoginSignupPage()), GoRoute(path: '/login', builder: (context, state) => LoginSignupPage()), GoRoute( path: '/projects/:projectShortId', builder: (context, state) { var projectShortId = state.params['projectShortId']!; return Consumer( builder: (context, ref, child) { ref .read(projectStateNotifierProvider.notifier) .setProjectFromCustomURI(projectShortId); return ViewProjectPage(); }, ); }, ) ], ); }

但是当我运行它时,最初键入URL“/projects/{userId1}”工作正常,但是如果我键入其他URL”/projects/{userId2}”,那么我会得到以下重建错误(他们'很长,但仅此之后带有一系列更新+重建框架错误):

Error: setState() or markNeedsBuild() called during build. C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 266:49 throw_ packages/flutter/src/widgets/framework.dart 4549:11 <fn> packages/flutter/src/widgets/framework.dart 4563:14 markNeedsBuild packages/flutter_riverpod/src/framework.dart 287:5 [_debugCanModifyProviders] packages/riverpod/src/framework/provider_base.dart 513:42 <fn> packages/riverpod/src/framework/provider_base.dart 337:7 setState packages/riverpod/src/state_notifier_provider/auto_dispose.dart 118:10 listener packages/state_notifier/state_notifier.dart 225:23 set state packages/myapp_mvp/state/providers/project_state_provider/project_state_provider.dart 33:5 setProjectFromCustomURI

	
flutter dart provider riverpod flutter-navigation
2个回答
1
投票
navigatorBuilder

从GO路由库中为每个儿童小部件创建一个消费者包装器,并创建一个自定义通知符和状态以存储路线参数,然后轻松从任何消费者窗口小部件(如您的

ViewProjectPage
)访问它们
navigatorBuilder: (context, state, child) { return Consumer( builder: (_, ref, __) { ref.watch(authControllerProvider).params = state.params; return child;}, ); },

汇款来自线程:
如何定义依赖提供商的gorouter?

为您的

GoRouter

0
投票

final routerProvider = Provider<GoRouter>((ref) { return GoRouter( initialLocation: '/login', routes: <GoRoute>[ GoRoute(path: '/', builder: (context, state) => LoginSignupPage()), GoRoute(path: '/login', builder: (context, state) => LoginSignupPage()), GoRoute( path: '/projects/:projectShortId', builder: (context, state) { var projectShortId = state.params['projectShortId']!; ref .read(projectStateNotifierProvider.notifier) .setProjectFromCustomURI(projectShortId); return ViewProjectPage(); }, ) ], ); });

    

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.