如何过滤 rxdart 中的 observable 列表

Posted

技术标签:

【中文标题】如何过滤 rxdart 中的 observable 列表【英文标题】:How to filter a list of obseravble in rxdart 【发布时间】:2019-06-27 06:12:59 【问题描述】:

我正在尝试在 rxdart 中实现 bloc 模式。我正在尝试构建 app 类型的 todo 应用程序。我实现了显示列表中的所有项目,但我想要的不是在不同部分显示已完成和未完成的项目。但是我无法根据在 rxdart 上完成来过滤项目。

import 'package:rxdart/rxdart.dart';
import '../models/ShoppingItem.dart';
class ShoppingItemBloc 
  final _shoppingItems = BehaviorSubject<List<ShoppingItem>> 
(seedValue: []);

Observable<List<ShoppingItem>> get allShoppingItems => 
_shoppingItems.stream;

 //Getter to implement
 Observable<List<ShoppingItem>> get completedShoppingItems =>

 dispose() 
  _shoppingItems.close();
 

我想要的是获得完整的 shoppingItems 。 ShoppingItem 类有一个布尔属性 completed 。我想在此基础上对其进行过滤。

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

您可以根据需要使用流中的位置进行过滤。由于您正在观察项目列表,因此您需要在过滤单个项目之前进行映射。在我们的例子中是这样的。

 Observable<List<ShoppingItem>> get completedShoppingItems => 
    _shoppingItems.stream.map((itemList) =>
        itemList.where((item) => item.completed));

【讨论】:

你需要把.toList()放在最后 是否可以返回满足条件的单个项目? 是的,你可以。只需使用 firstWhere 而不是 where。这将返回满足条件的第一个项目。更多阅读api.dart.dev/stable/2.9.3/dart-core/Iterable/firstWhere.html

以上是关于如何过滤 rxdart 中的 observable 列表的主要内容,如果未能解决你的问题,请参考以下文章

Rxdart combinelaststream 功能不起作用

如何做一个 switchmap 或任何更好的方法来替换 RxDart 中的值

如何使用 rxdart 获取 Stream<String> 中的最后一个值?

dart 中的节流函数执行

如何过滤 Observable 数组?

如何使用 observable 的输出来过滤另一个