Flutter 编程时候的 BLoC + Stream 架构模式

本文最后更新于 2021年4月4日 晚上

这篇是看了几个文章之后写的一些总结.

BLoC + Stream 的体系

也就是类似在业务逻辑层的接口上使用 Observable 作为返回值的那种样式, 出自这篇文章.

Dart 中的 Stream 是一种异步编程 API, 和 Future 在一起的.

这套体系中, 唯一需要的是明确 Stream API 的用法.

Stream 有两种类型:

  • 单一观察序列: 即只能有一个观察者, 且只能被观察一次.

  • 广播序列: 可以有多个观察者, 可以在任意时刻进行观察.

且在 Dart 的世界中, Stream 就相当于 Observable, StreamController 就相当于 Subject.

可以在简单的场合下直接使用 Stream, 如果在其他复杂场景下, 还是需要借助 Rx 来实现, 更方便高效.

这里推荐使用 Subject 作为 BLoC 和表示层通信工具, 靠谱么? 实际上和调用接口一样, 不过存在额外的复杂性. 在 VM 结构中, 序列仅是在 VM 中进行一次转换后又回到了视图控制器中, 在转换的过程就实现了接口调用等操作, 然后表示层根据转换后的输出观察结果并改变显示.

而这里的场景中, 使用的是 sink 作为 BLoC 的输入, stream 作为 BLoC 的输出.

实际上这个做法就省略了一层 VM 那种效果, 直接将 BLoC 暴露给表示层. 实际上 BLoC 作为单纯的业务逻辑功能层提供接口才比较靠谱. 仍然需要一层来做转换.

这样的话, 业务逻辑就可以相对简单, 而不用引入 Rx, 通过 Future 暴露异步结果即可.

在文中说的是 BLoC 作为 VM 的效果来使用, 实际上不怎么靠谱, 如果要多端共享代码, 业务逻辑就不要和表示层内容挂钩了吧. VM 想要调用 BLoC 的接口, 还是说 VM 中使用 Rx, 都和 BLoC 没有关系.


Flutter 编程时候的 BLoC + Stream 架构模式
https://blog.rayy.top/2019/01/27/2019-45-flutter-bloc-stream/
作者
貘鸣
发布于
2019年1月27日
许可协议