如何为GoRouter生成的页面路由重写Riverpod Provider?
问题:GoRouter路由中重写Riverpod Provider仍触发UnimplementedError
相关代码
需要重写的Provider
@Riverpod(dependencies: []) AssessmentEvent currentEvent(CurrentEventRef ref) => throw UnimplementedError();
路由的ProviderScope配置
class AssessRoute extends GoRouteData { const AssessRoute(this.assessmentId, this.$extra); static const path = 'assess'; final AssessmentEvent $extra; @override Widget build(BuildContext context, GoRouterState state) { return ProviderScope( overrides: [ currentEventProvider.overrideWithValue($extra), ], child: const AssessPage(), ); } }
跳转至AssessPage的代码
await AssessRoute(item.event).push(context);
排查与修复方案
修正构造参数不匹配问题
跳转代码只传入了一个参数,但路由类构造函数要求两个参数,导致$extra未被正确赋值,重写时传入无效值,触发原Provider的错误。
调整路由类与跳转代码:// 路由类调整(如果assessmentId是路径参数,改用state.params获取) class AssessRoute extends GoRouteData { const AssessRoute({required this.assessmentId, required this.$extra}); static const path = 'assess'; final String assessmentId; // 按实际类型调整 final AssessmentEvent $extra; @override Widget build(BuildContext context, GoRouterState state) { return ProviderScope( overrides: [ currentEventProvider.overrideWithValue($extra), ], child: const AssessPage(), ); } } // 跳转代码调整 await AssessRoute(assessmentId: "对应ID值", $extra: item.event).push(context);检查ProviderScope作用域
确认AssessPage及其子组件没有嵌套额外的ProviderScope,避免覆盖重写的Provider。验证Provider读取方式
确保AssessPage中通过ref.watch(currentEventProvider)正确读取,且ref来自ConsumerWidget、Consumer或当前ProviderScope内的有效实例。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

