RxDart框架学习

Posted DTCLOUD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RxDart框架学习相关的知识,希望对你有一定的参考价值。

一、RxDart是什么?

RxDart是一个响应式编程框架,是基于 ReactiveX 的响应式函数编程库,ReactiveX是一个强大的库,通过使用可观察的序列来编写异步的程序。它突破了语言以及平台的限制,使我们在写异步程序的时候更简洁。
ReactiveX 开发过多个语言下的响应式框架,比较有名的就是RxJava、RxSwift、RxJS、RxKotlin等等。RxDart也是其中之一,Dart本身就有 Stream 类,RxDart在其基础上提供了其他Stream类、运算符、和Subject等封装。

二、RxDart的引入

打开我们的flutter的项目的pubspec.yaml 文件,在dependencies 中添加依赖: rxdart: ^0.27.4;

然后在终端 flutter pub get 安装依赖就可以在项目中使用了。

三、Stream的使用

从新的版本0.23.1开始,RxDart删除了Observable相关的类,所有的功能都集成到了dart中的Stream类中了,我们可以通过Stream.fromIterable()、Stream.fromFuture()等来创建Observables对象。
Subject是RxDart的流控制器,Subjects有三种类型:

  1. PublishSubjects: PublishSubjects支持添加多个监听。

输出结果:

由于第二个监听之前在第一个数据添加后再监听的,所以第一条数据没有监听到。

  1. BehaviourSubject:每一个新添加的监听,接收到的第一个数据都是上一个的数据(注:只会缓存一个数据)

输出结果:

我们发现第二个监并没有监听到data1,但是可以监听到data2,而且第二个监听会比第一个监听先监听到data3,这是由于你不能决定多个监听的顺序,一般来说都是后加的监听会先接收到数据,不过每个监听所获取到的数据还是有序的。

  1. ReplaySubject:回放已经推送过的事件。

输出结果:

为了防止内存溢出,当你不再收听subject时,请一定要记得释放它。

四、常用操作符

  1. map
    map可以让我们迭代的每一个数据处理并返回一个新的数据。

输出结果: [2,3,4,5]

  1. flatmap
    如果迭代的对象里也有数组的子项,而我们恰好要遍历对象数组中的子项,正常我们需要使用两个for循环来遍历输出,而如果我们用flatmap的话便可以轻松遍历;

输出结果: [1, 2, 5, 3, 6, 4, 7, 8],这里要注意的是输出的结果也是无序的。

  1. expand
    expand可以让我们把每个子项扩展成n多个对象。

输出结果: [1, 11, 2, 12, 3, 13, 4, 14]

  1. merge
    merge可以让我们合并多个流。

输出结果[1, 2, 5, 3, 6, 4, 7, 8],这里也要注意输出的结果是无序的。
这里只是列举了一些比较常用的操作符,RxDart还有很多非常有用的方法,比如( interval、throttle、skipUntil等等 ),详细可以参照官方文档。

五、总结

我们在平时的项目中使用RxDart,可以方便我们在业务层实现代码逻辑相分离,大大简化代码逻辑。提高程序的响应速度。当然也不是要我们的代码都使用。如果是为了使用而使用,反而会把简单问题复杂化。
以上介绍仅仅是对RxDart的一个入门简介,还有很多的Rx相关技术等待我们去挖掘。只是通过希望这边文章,给大家在平时的开发中提供更多的思路。

作者:林晓峰

如何过滤 rxdart 中的 observable 列表

【中文标题】如何过滤 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框架学习的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的 rxdart 使用未被识别

使用 rxDart 合并 Firestore 流

Observable 在 rxdart 0.23.1 中已弃用

如何在颤振中降级 rxdart 插件?

Flutter 使用流“RxDart”提交登录 Bloc

用 Bloc 实现简单的 rxDart 没有得到结果