Observable
被观察对象
可以用下面方式创建:
Observable<String> _observable = Observable(Stream.fromIterable(['hello','你好']));
Observable<String> _observable = Observable.fromFuture(Future.value('hello'));
Observable<String> _observable = Observable.fromIterable(['hello','你好']);
Observable<String> _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<String> _subject = PublishSubject<String>();
_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<String> _subject = ReplaySubject<String>(maxSize: 2);
_subject.listen((data)=>print('$data output1'));
_subject.add('hello');
_subject.add('你好');
_subject.listen((data)=>print('$data output2'));
_subject.close();