flutter rxdart

Observable

被观察对象

可以用下面方式创建:

Observable _observable = Observable(Stream.fromIterable(['hello','你好']));
    Observable _observable = Observable.fromFuture(Future.value('hello'));
    Observable _observable = Observable.fromIterable(['hello','你好']);
    Observable _observable = Observable.periodic(Duration(seconds: 1), (x)=>x.toString());

用下面方式侦听

_observable.listen((data)=>print('$data obs listener'));

PublishSubject

前置侦听, 在add时结算

行为 结果
listen1,add1, add2 listen1会依次执行add1,add2通知
listen1,add1, add2,listen2 listen1会依次执行add1,add2通知,listen2什么也不执行
PublishSubject _subject = PublishSubject();
    _subject.listen((data)=>print('$data output1'));
    _subject.add('hello');
    _subject.listen((data)=>print('$data output2'));
    _subject.add('你好');

    _subject.close();

侦听

如果侦听添加到add后,则不会接受之前任何add事件
不过,BehaviorSubject则不需要考虑前后顺序

_subject.listen((data)=>print('$data output2'));

添加

 _subject.add('你好');

关闭

_subject.close();

BehaviorSubject

后置监听,在周期结束结算,并只保留最近一次add事件(简单理解,但并不全是)

行为 结果
listen1,add1, add2 listen1会依次执行add1,add2通知
listen1,add1, add2,listen2 listen1会依次执行add1,两个listener都执行add2通知,无论后面加再多的listener

ReplaySubject

完全监听,在周期结束结算,并保留所有add发送给所有侦听者,无论顺序。如果maxSize为1,则效果如同BehaviorSubject

行为 结果
listen1,add1, add2 listen1会依次执行add1,add2通知
listen1,add1, add2,listen2 两个listener都执行add1, add2通知,无论后面加再多的listener
ReplaySubject _subject = ReplaySubject(maxSize: 2);
    _subject.listen((data)=>print('$data output1'));
    _subject.add('hello');
    _subject.add('你好');
    _subject.listen((data)=>print('$data output2'));
    _subject.close();

你可能感兴趣的:(flutter rxdart)