Flutter 开发实战

235课时
1K学过
8分

课程评价 (0)

请对课程作出评价:
0/300

学员评价

暂无精选评价
2分钟

03 Stream 四天王

从上面我们知道,在 Flutter 中使用 Stream 主要有四个对象,那么这四个对象是如何“勾搭”在一起的?他们各自又担任什么责职呢?

首先如下图,我们可以从进阶版的流程图上看出 整个 Stream 的内部工作流程。

img

Flutter中 StreamStreamControllerStreamSinkStreamSubscription 都是 abstract 对象,他们对外抽象出接口,而内部实现对象大部分都是 _ 开头的如 _SyncStreamControllerControllerStream 等私有类,在这基础上整个流程概括起来就是:

有一个事件源叫 Stream,为了方便控制 Stream ,官方提供了使用 StreamController 作为管理;同时它对外提供了 StreamSink 对象作为事件输入口,可通过 sink 属性访问; 又提供 stream 属性提供 Stream 对象的监听和变换,最后得到的 StreamSubscription 可以管理事件的订阅。

所以我们可以总结出:

  • StreamController :如类名描述,用于整个 Stream 过程的控制,提供各类接口用于创建各种事件流。
  • StreamSink:一般作为事件的入口,提供如 addaddStream 等。
  • Stream:事件源本身,一般可用于监听事件或者对事件进行转换,如 listenwhere
  • StreamSubscription:事件订阅后的对象,表面上用于管理订阅过等各类操作,如 cacenlpause ,同时在内部也是事件的中转关键。

回到 Stream 的工作流程上,在上图中我们知道, 通过 StreamSink.add 添加一个事件时, 事件最后会回调到 listen 中的 onData 方法,这个过程是通过 zone.runUnaryGuarded 执行的,这里 zone.runUnaryGuarded 是什么作用后面再说,我们需要知道这个 onData 是怎么来的?

image.png

如上图,通过源码我们知道:

  • 1、Streamlisten 的时候传入了 onData 回调,这个回调会传入到 StreamSubscription 中,之后通过 zone.registerUnaryCallback 注册得到 _onData 对象( 不是前面的 onData 回调哦 )。
  • 2、StreamSink 在添加事件是,会执行到 StreamSubscription 中的 _sendData 方法,然后通过 _zone.runUnaryGuarded(_onData, data); 执行 1 中得到的 _onData 对象,触发 listen 时传入的回调方法。

可以看出整个流程都是和 StreamSubscription 相关的,现在我们已经知道从 事件入口到事件出口 的整个流程时怎么运作的,那么这个过程是**怎么异步执行的呢?其中频繁出现的 zone 是什么?