RxDart学习

作者: 过期的薯条 | 来源:发表于2019-03-12 21:42 被阅读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
  }

相关文章

网友评论

    本文标题:RxDart学习

    本文链接:https://www.haomeiwen.com/subject/ckxppqtx.html