Flutter-Riverpod - 如何组合提供者来过滤流

Mat*_*att 4 flutter riverpod

我正在尝试遵循有关如何使用 Flutter 和 Riverpod 组合提供程序来过滤项目列表的示例文档。数据来自使用 Streams 的 Firestore:

final carListProvider = StreamProvider.autoDispose<List<Car>>((ref) {
  final carsRepo = ref.watch(carsRepositoryProvider);
  return carsRepo.cars();
});
Run Code Online (Sandbox Code Playgroud)

这一切都工作正常,我可以使汽车列表没有问题。现在我想为用户提供根据颜色过滤列表的选项:

enum CarColorFilter {
  all,
  red,
  white,
  black,
}

final carListFilter = StateProvider((_) => CarListFilter.all);
Run Code Online (Sandbox Code Playgroud)

然后按照文档示例,我尝试组合提供程序:

final filteredCars = StreamProvider<List<Car>>((ref) {
  final filter = ref.watch(carListFilter);
  final cars = ref.watch(carListProvider); <-- This line throws the error

  switch (filter.state) {
    case CarColorFilter.all:
      return cars;
    case CarColorFilter.red:
      return cars.where(...)

    default:
  }
})
Run Code Online (Sandbox Code Playgroud)

在声明“cars”变量的行上,编辑抱怨道:

参数类型“AutoDisposeStreamProvider <List>”无法分配给参数类型“AlwaysAliveProviderBase <Object,dynamic>”

我认为我的用例和文档之间的区别在于,在给出的示例中, is List<Todo>aStateNotifierProvider而在我的例子中,List<Car>is a StreamProvider。任何帮助将非常感激。

Mat*_*att 5

在文档中找到了答案,发布在这里以防对其他人有帮助:

使用 .autoDispose 时,您可能会发现应用程序无法编译,并出现类似于以下内容的错误:

参数类型“AutoDisposeProvider”无法分配给参数类型“AlwaysAliveProviderBase”

不用担心!这个错误是自愿的。发生这种情况是因为您很可能遇到了错误:

您尝试在未标记为 .autoDispose 的提供程序中侦听标记为 .autoDispose 的提供程序

将filteredList 提供程序标记为autoDispose解决了该问题。