03 Stream 四天王
从上面我们知道,在 Flutter 中使用 Stream
主要有四个对象,那么这四个对象是如何“勾搭”在一起的?他们各自又担任什么责职呢?
首先如下图,我们可以从进阶版的流程图上看出 整个 Stream
的内部工作流程。
Flutter中 Stream
、StreamController
、StreamSink
和 StreamSubscription
都是 abstract
对象,他们对外抽象出接口,而内部实现对象大部分都是 _
开头的如 _SyncStreamController
、ControllerStream
等私有类,在这基础上整个流程概括起来就是:
有一个事件源叫 Stream
,为了方便控制 Stream
,官方提供了使用 StreamController
作为管理;同时它对外提供了 StreamSink
对象作为事件输入口,可通过 sink
属性访问; 又提供 stream
属性提供 Stream
对象的监听和变换,最后得到的 StreamSubscription
可以管理事件的订阅。
所以我们可以总结出:
- StreamController :如类名描述,用于整个
Stream
过程的控制,提供各类接口用于创建各种事件流。 - StreamSink:一般作为事件的入口,提供如
add
,addStream
等。 - Stream:事件源本身,一般可用于监听事件或者对事件进行转换,如
listen
、where
。 - StreamSubscription:事件订阅后的对象,表面上用于管理订阅过等各类操作,如
cacenl
、pause
,同时在内部也是事件的中转关键。
回到 Stream
的工作流程上,在上图中我们知道, 通过 StreamSink.add
添加一个事件时, 事件最后会回调到 listen
中的 onData
方法,这个过程是通过 zone.runUnaryGuarded
执行的,这里 zone.runUnaryGuarded
是什么作用后面再说,我们需要知道这个 onData
是怎么来的?
如上图,通过源码我们知道:
- 1、
Stream
在listen
的时候传入了onData
回调,这个回调会传入到StreamSubscription
中,之后通过zone.registerUnaryCallback
注册得到_onData
对象( 不是前面的onData
回调哦 )。 - 2、
StreamSink
在添加事件是,会执行到StreamSubscription
中的_sendData
方法,然后通过_zone.runUnaryGuarded(_onData, data);
执行 1 中得到的_onData
对象,触发listen
时传入的回调方法。
可以看出整个流程都是和 StreamSubscription
相关的,现在我们已经知道从 事件入口到事件出口 的整个流程时怎么运作的,那么这个过程是**怎么异步执行的呢?其中频繁出现的 zone
是什么?
学员评价