1分钟
10 rxdart
其实无论从订阅或者变换都可以看出, Dart 中的 Stream
已经自带了类似 rx
的效果,但是为了让 rx
的用户们更方便的使用,ReactiveX 就封装了 rxdart
来满足用户的熟悉感,如下图所示为它们的对应关系:
在 rxdart
中, Observable
是一个 Stream
,而 Subject
继承了 Observable
也是一个 Stream
,并且 Subject
实现了 StreamController
的接口,所以它也具有 Controller 的作用。
如下代码所示是 rxdart
的简单使用,可以看出它屏蔽了外界需要对 StreamSubscription
和 StreamSink
等的认知,更符合 rx
历史用户的理解。
final subject = PublishSubject<String>();
subject.stream.listen(observerA);
subject.add("AAAA1");
subject.add("AAAA2"));
subject.stream.listen(observeB);
subject.add("BBBB1");
subject.close();
这里我们简单分析下,以上方代码为例,
PublishSubject
内部实际创建是创建了一个广播StreamController.broadcast
。- 当我们调用
add
或者addStream
时,最终会调用到的还是我们创建的StreamController.add
。 - 当我们调用
onListen
时,也是将回调设置到StreamController
中。 rxdart
在做变换时,我们获取到的Observable
就是 this,也就是PublishSubject
自身这个Stream
,而Observable
一系列的变换,也是基于创建时传入的stream
对象,比如:
@override
Observable<S> asyncMap<S>(FutureOr<S> convert(T value)) =>
Observable<S>(_stream.asyncMap(convert));
所以我们可以看出来,rxdart
只是对 Stream
进行了概念变换,变成了我们熟悉的对象和操作符,而这也是为什么 rxdart
可以在 StreamBuilder
中直接使用的原因。
所以,到这里你对 Flutter 中 Stream 有全面的理解了没?
学员评价