Flutter Riverpod - .autoDispose - 参数类型"AutoDisposeProvider"不能分配给参数类型'AlwaysAliveProviderBase'



根据文档,当我得到这个错误时,我应该标记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: () => [],
);
});

最新更新