You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:26:00