【发布时间】:2023-02-22 14:50:20
【问题描述】:
为了访问非小部件类中的提供程序,我使用了 Reader 函数。更新Riverpod依赖到^2.0.2版本后,Reader功能好像没有了。你建议什么解决方法?
我应该将 Ref 或 WidgetRef 作为参数传递给类构造函数吗?
当我传递 WidgetRef 时,它无法识别状态和方法。
【问题讨论】:
为了访问非小部件类中的提供程序,我使用了 Reader 函数。更新Riverpod依赖到^2.0.2版本后,Reader功能好像没有了。你建议什么解决方法?
我应该将 Ref 或 WidgetRef 作为参数传递给类构造函数吗?
当我传递 WidgetRef 时,它无法识别状态和方法。
【问题讨论】:
这是 Riverpod 2 中的一个突破性变化。
您应该将 ref 作为参数传递,并在您之前使用 reader 的地方使用 ref.read 。
例子:
final userTokenProvider = StateProvider<String>((ref) => null);
final repositoryProvider = Provider(Repository.new);
class Repository {
Repository(this.ref);
final Ref ref;
Future<Catalog> fetchCatalog() async {
String token = ref.read(userTokenProvider);
final response = await dio.get('/path', queryParameters: {
'token': token,
});
return Catalog.fromJson(response.data);
}
}
【讨论】:
您还可以定义一个自定义的“Reader”,但不推荐这样做。不过,当你想逐步迁移到新版本的 Riverpod 2.0 时,它可能会派上用场
typedef Reader = T Function<T>(ProviderBase<T> provider);
【讨论】: