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

定义Riverpod的AutoDisposeFamilyAsyncNotifierProvider时调用报错求解决

解决Riverpod AutoDisposeFamilyAsyncNotifierProvider调用报错问题

问题根源

你碰到的The expression doesn't evaluate to a function, so it can't be invoked错误,核心原因是Provider的创建方式不符合Riverpod无代码生成的规范。你直接实例化了底层的AutoDisposeFamilyAsyncNotifierProvider类,但正确的Family类型AsyncNotifier Provider应该通过AutoDisposeAsyncNotifierProvider.family构造器创建。

修复方案

1. 修正Provider定义

把原Provider定义替换为以下代码:

final findGoalListProvider = AutoDisposeAsyncNotifierProvider.family<AsyncGoalListNotifier, GdGoalPageResponse, GoalListPageParameter>(
  AsyncGoalListNotifier.new,
);

这个方式创建的Provider实例支持findGoalListProvider(arg)的调用语法,符合Family Provider的使用规则。

2. 可选优化:避免修改监听的可变状态

你的build方法中直接修改ref.watch(selectGoalFilterProvider)返回的aParams对象是危险的——如果selectGoalFilterProvider维护的是可变状态,这种修改会导致状态不一致。建议创建对象副本后再修改:
假设FindParameters和其内部的search对象有copyWith方法,可以这样写:

case GoalListFilterSource.select:
  final originalParams = ref.watch(selectGoalFilterProvider);
  aParams = originalParams.copyWith(
    search: originalParams.search.copyWith(
      filters: [
        ...originalParams.search.filters,
        Filter(
          attribute: GdGoalUtil.attributeOpen,
          fieldType: GdFieldType.typeBool,
          operand: SearchOperand.equals,
          value: FilterValue.bool(true),
        ),
      ],
    ),
  );
  break;

如果没有copyWith方法,就手动创建新的FindParameters实例,复制原有属性后添加新过滤器。

3. 组件调用代码无需修改

你原来的调用代码是正确的,修正Provider定义后即可正常运行:

final anAsync = ref.watch(findGoalListProvider(GoalListPageParameter(pageNumber: 0, filterSource: widget.filterSource)));

额外小优化

GoalListPageParameter的props可以简化,枚举类型本身支持Equatable的相等比较,无需取index:

@override
List<Object?> get props => [pageNumber, filterSource];

内容的提问来源于stack exchange,提问作者Davout

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:43:14