Dart/Flutter中如何过滤流内列表中的元素?
解决Riverpod流中列表元素的过滤问题
你遇到的核心问题是:当前拿到的是Stream<List<Item>>类型的流(流的每个元素是整个Item列表),而非Stream<Item>(流的每个元素是单个Item),所以不能直接在流对象上调用.where()。正确的做法是对流发出的每个列表单独做元素过滤,再把过滤后的列表重新作为流的元素发出。
方法一:使用async*和await for(直观易读)
@riverpod Stream<List<Item>> notDoneItems(NotDoneItemsRef ref) async* { // 获取原始的Item列表流 final itemListStream = ref.watch(listItemsServiceProvider).listItems(); // 遍历流中的每一份Item列表 await for (final items in itemListStream) { // 过滤掉isDone为true的元素,转成List后发出 yield items.where((item) => !item.isDone).toList(); } }
方法二:使用Stream的map方法(简洁高效)
如果不需要额外的中间逻辑,直接用map转换流的每个元素会更简洁:
@riverpod Stream<List<Item>> notDoneItems(NotDoneItemsRef ref) { final itemListStream = ref.watch(listItemsServiceProvider).listItems(); // 对每个列表做过滤转换,返回新的流 return itemListStream.map((items) => items.where((item) => !item.isDone).toList()); }
两种方式的核心都是:先拿到流中的完整列表,再对列表内部的元素用.where()过滤,最后将过滤后的列表作为新的流元素输出。注意.where()返回的是Iterable<Item>,需要调用.toList()转成List<Item>,和原始流的元素类型保持一致。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

