根据文档,当我得到这个错误时,我应该标记Providers
与.autoDispose
:
参数类型'AutoDisposeProvider'不能分配给参数类型'AlwaysAliveProviderBase'
为什么我仍然得到错误在这个极简主义的例子?
final a = FutureProvider.autoDispose<List<String>>((ref) {
return Future.value(["test"]);
});
final b = FutureProvider.autoDispose<List<String>>((ref) {
return ref.watch(a);
});
发生此错误是因为您试图在未标记为。autodispose的提供程序中监听带有。autodispose标记的提供程序。
final firstProvider = Provider.autoDispose((ref) => 0);
final secondProvider = Provider((ref) {
// The argument type 'AutoDisposeProvider<int>' can't be assigned to the
// parameter type 'AlwaysAliveProviderBase<Object, Null>'
ref.watch(firstProvider);
});
解决方案是用. autodispose标记secondProvider。
final firstProvider = Provider.autoDispose((ref) => 0);
final secondProvider = Provider.autoDispose((ref) {
ref.watch(firstProvider);
});
我刚从官方Riverpod复制解决方案文档在页面的底部:https://riverpod.dev/docs/concepts/modifiers/auto_dispose/
这不是因为autoDispose
。如果用以下代码替换代码,您将再次得到错误:
// Removed "autoDispose"
final a = FutureProvider<List<String>>((ref) {
return Future.value(["test"]);
});
final b = FutureProvider<List<String>>((ref) {
return ref.watch(a);
});
错误:
The argument type 'FutureProvider<List<String>>' can't be assigned to the parameter type 'AlwaysAliveProviderListenable<FutureOr<List<String>>>'.
原因是a
提供程序的值是AsyncValue
,所以b
提供程序应该返回AsyncValue<List<String>>
而不是List<String>
,如果它直接返回数据。
final a = FutureProvider.autoDispose<List<String>>((ref) {
return Future.value(["test"]);
});
final b = FutureProvider.autoDispose<AsyncValue<List<String>>>((ref) {
return ref.watch(a);
});
或者它可以使用该值并处理它,然后返回基于该值的另一个列表,如:
final a = FutureProvider.autoDispose<List<String>>((ref) {
return Future.value(["test"]);
});
final b = FutureProvider.autoDispose<List<String>>((ref) async {
final value = ref.watch(a);
// Doing another operation
await Future.delayed(const Duration(seconds: 2));
return value.maybeWhen(
data: (data) => data.map((e) => 'B $e').toList(),
orElse: () => [],
);
});