定义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

