RxDart学习
2019-03-12 本文已影响0人
过期的薯条
1.引言
rxjava+okhttp 很完美解决了网络请求的问题。那么dart是否也有RxDart呢,很显然的确是有的。下面开始学习RxDart。官网:https://pub.dartlang.org/documentation/rxdart
2.正题
2.1 Obserable
如rxjava一样。Obserable可以通过静态方法just,from等创建,其构造方法是传入一个Stream。
void function1() {
List array = [1, 2, 3, 4, 5, 6, 7];
Observable.fromIterable(array).map<String>((data) {
return (data + 1).toString();
}).doOnListen(() {
print("被监听");
}).listen((data) {
print(data);
});
}
输出的答案是:2,3,4,5,6,7,8
2.2 PublishSubject
PublishSubject 称为StreamController。其类结构是:Object->Obserable->Subject->PublishSubject. 通过调用Stream方法得到Obserable。有如下特性
- 添加数据,在监听之前,不会发射数据
void function2() {
subject1 = new PublishSubject<int>();
subject1.add(2);
subject1.add(1);//数据放在监听之前,不会发出数据
subject1.stream.listen((data) {
print("listen1 " + data.toString());
});
subject1.stream.listen((data) {
print("listen2 " + data.toString());
});
//输出结果:
}
- 添加数据项之前,有几个监听,那么添加之后就会执行几个
void function2() {
subject1 = new PublishSubject<int>();
subject1.stream.listen((data) {
print("listen1 " + data.toString());
});
subject1.add(1); //数据放在监听之前,不会发出数据
subject1.stream.listen((data) {
print("listen2 " + data.toString());
});
subject1.add(2);
//输出结果:1,2,2
}
规律: 添加数据项之前,有几个监听,那么添加之后就会执行几个
2.3 BehaviorSubject
BehaviorSubject 是另外一种流控制。和PublishSubject 类关系一样,用法和PublishSubject有点差异。
BehaviorSubject添加数据,这个数据能被listen处理,有这样的一个规则。举一个例子:
subject1.add(1).subject.add(2)。。add(2)以上的listen 都能被处理add(1)。add(2)以下的listen 都不能被处理add(1)。假如只有一个add.那么所有的监听都能处理.
void function3() {
BehaviorSubject behaviorSubject = new BehaviorSubject();
behaviorSubject.add(1);
behaviorSubject.stream.listen((data) {
print("listen1 " + data.toString());
});
behaviorSubject.add(2);
behaviorSubject.stream.listen((data) {
print("listen2 " + data.toString());
});//输出: listen1 1,listen1 2,listen2 2
假如只有一个add(数据项)
void function3() {
BehaviorSubject behaviorSubject = new BehaviorSubject();
behaviorSubject.add(1);
behaviorSubject.stream.listen((data) {
print("listen1 " + data.toString());
});
// behaviorSubject.add(2);
behaviorSubject.stream.listen((data) {
print("listen2 " + data.toString());
});//输出 listen1 1, listen2 1
// behaviorSubject.add(2);
}
规律: 任何一个add(数据)都能被所有的listen处理。多个add(数据)会产生影响。例如上面的demo。behaviorSubject.add(1); 只能被behaviorSubject.add(2);以上的监听所执行
2.4 ReplaySubject
ReplaySubject 和BehaviorSubject很相似。假设ReplaySubject 没有设置maxSize。任何一个add都能被所有的监听接收到。假如设置了maxSize,并且添加的数据大于maxSize ,那么就会按照BehaviorSubject的规则来。
void function3() {
ReplaySubject replaySubject = new ReplaySubject<String>(maxSize: 1);
replaySubject.add("1");
replaySubject.stream.listen((data) {
print("listen1 "+data);
});
replaySubject.add("2");
replaySubject.add("3");
replaySubject.stream.listen((data) {
print("listen2 "+data);
});
//输出 listen1 1 listen1 2 listen2 3 listen1 3
}