使用Riverpod生成器配置Amplitude读取时报错,求解决方案
Riverpod生成式Provider调用ref.read时报错的解决办法
问题重现
使用Riverpod生成器定义Amplitude的Provider:
@riverpod Amplitude amplitudeProvider(AmplitudeProviderRef ref) { final Amplitude amplitude = Amplitude.getInstance(); amplitude.init(Env.amplitudeApiKey); return amplitude; }
调用ref.read(amplitudeProvider)时触发错误:
The argument type 'Amplitude Function(ProviderRef)' can't be assigned to the parameter type 'ProviderListenable'.
手动定义的Provider可正常工作,但不想混合生成式与非生成式写法:
final amplitudeProvider = Provider<Amplitude>((ref) { final Amplitude amplitude = Amplitude.getInstance(); amplitude.init(Env.amplitudeApiKey); return amplitude; });
错误原因
Riverpod生成器会将带@riverpod注解的函数转换为Provider对象,但你直接调用的amplitudeProvider只是原构建函数,并非生成的Provider实例,因此类型不匹配导致报错。此外,若未运行代码生成命令,生成的Provider代码不存在,IDE会将函数识别为普通函数,也会引发该问题。
解决步骤
方法1:调整函数名并执行代码生成
将生成式Provider的函数名改为简洁名称(如amplitude),避免与生成的Provider名称冲突:
@riverpod Amplitude amplitude(AmplitudeProviderRef ref) { final Amplitude amplitude = Amplitude.getInstance(); amplitude.init(Env.amplitudeApiKey); return amplitude; }
运行代码生成命令:
# Flutter项目 flutter pub run build_runner watch # Dart项目 dart run build_runner watch
生成后会自动创建amplitudeProvider实例,此时调用ref.read(amplitudeProvider)即可正常工作。
方法2:使用生成的Provider名称(不推荐)
若坚持原函数名,生成器会在原函数名后追加Provider作为生成的Provider名称,调用时需改为:
final amplitude = ref.read(amplitudeProviderProvider);
这种命名方式不够直观,不建议使用。
验证
修改后重新运行项目,调用对应生成的Provider即可成功获取Amplitude实例,不再出现类型错误。
内容的提问来源于stack exchange,提问作者Ole Spaarmann
相关产品推荐
相关产品推荐

