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有三种类型:
- PublishSubjects: PublishSubjects支持添加多个监听。
输出结果:
由于第二个监听之前在第一个数据添加后再监听的,所以第一条数据没有监听到。
- BehaviourSubject:每一个新添加的监听,接收到的第一个数据都是上一个的数据(注:只会缓存一个数据)
输出结果:
我们发现第二个监并没有监听到data1,但是可以监听到data2,而且第二个监听会比第一个监听先监听到data3,这是由于你不能决定多个监听的顺序,一般来说都是后加的监听会先接收到数据,不过每个监听所获取到的数据还是有序的。
- ReplaySubject:回放已经推送过的事件。
输出结果:
为了防止内存溢出,当你不再收听subject时,请一定要记得释放它。
四、常用操作符
- map
map可以让我们迭代的每一个数据处理并返回一个新的数据。
输出结果: [2,3,4,5]
- flatmap
如果迭代的对象里也有数组的子项,而我们恰好要遍历对象数组中的子项,正常我们需要使用两个for循环来遍历输出,而如果我们用flatmap的话便可以轻松遍历;
输出结果: [1, 2, 5, 3, 6, 4, 7, 8],这里要注意的是输出的结果也是无序的。
- expand
expand可以让我们把每个子项扩展成n多个对象。
输出结果: [1, 11, 2, 12, 3, 13, 4, 14]
- 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框架学习的主要内容,如果未能解决你的问题,请参考以下文章