所以我的代码看起来像这样:
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
navigatorBuilder
从GO路由库中为每个儿童小部件创建一个消费者包装器,并创建一个自定义通知符和状态以存储路线参数,然后轻松从任何消费者窗口小部件(如您的
ViewProjectPage
)访问它们
navigatorBuilder: (context, state, child) {
return Consumer(
builder: (_, ref, __) {
ref.watch(authControllerProvider).params = state.params;
return child;},
);
},
汇款来自线程:如何定义依赖提供商的gorouter?
GoRouter
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();
},
)
],
);
});