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

时间:2021-02-26 07:51:52

标签: flutter riverpod

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

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

这一切正常,我可以毫无问题地渲染汽车列表。现在我想让用户选择根据颜色过滤列表:

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

final carListFilter = StateProvider((_) => CarListFilter.all);

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

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:
  }
})

在声明 'cars' 变量的行中,编辑器抱怨:

<块引用>

参数类型 'AutoDisposeStreamProvider' 不能是 分配给参数类型 'AlwaysAliveProviderBase'

我认为我的用例和文档之间的区别在于,在给出的示例中,List<Todo>StateNotifierProvider 而在我的情况下,List<Car>StreamProvider .任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

<块引用>

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

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

别担心!这个错误是自愿的。它发生是因为你最 可能有错误:

您试图在一个 未用 .autoDispose 标记的提供程序

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