You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:15:59