Flutter 82: 初识 Flutter Stream (二)

简介: 0 基础学习 Flutter,第八十二步:学习基础的 Stream 和 StreamController!

      小菜上周刚学习了 Stream 的部分方法,对 Stream 流的认知还很浅显,今天继续学习基础的 Stream 方法;

Stream Types

Single-Subscription

      Single-Subscription 为单一订阅流,是最常见的 Stream 类型,这种方式只能被监听一次,若多次监听会导致 error

var data = [1, 2, '3.toString()', true, true, false, true, 6];
Stream stream = Stream.fromIterable(data).distinct();
stream
    .listen((event) => print('Liste1 -> Stream.fromIterable -> $event'))
    .onDone(() => print('onDone1 -> Stream.fromIterable -> done 结束'));
stream
    .listen((event2) => print('Liste2 -> Stream.fromIterable -> $event2'))
    .onDone(() => print('onDone2 -> Stream.fromIterable -> done 结束'));

Broadcast

      Broadcast 为广播订阅流,允许任意数量的接收者,这种方式可以在同一时间设置多个不同的监听器同时监听,同时你也可以在取消上一个订阅后再次对其发起监听;单一订阅流可以通过 asBroadcastStream 方式创建广播流;

var data = [1, 2, '3.toString()', true, true, false, true, 6];
Stream stream = Stream.fromIterable(data).distinct();
stream = stream.asBroadcastStream();
stream
    .listen((event) => print('Liste1 -> Stream.fromIterable -> $event'))
    .onDone(() => print('onDone1 -> Stream.fromIterable -> done 结束'));
stream
    .listen((event2) => print('Liste2 -> Stream.fromIterable -> $event2'))
    .onDone(() => print('onDone2 -> Stream.fromIterable -> done 结束'));

Listener

      小菜在之前的测试 Code 中都使用了 Listener,当 Stream 事件发出时可以通过 Listener 监听其状态;

StreamSubscription<T> listen(void onData(T event),
      {Function onError, void onDone(), bool cancelOnError});

StreamController

      StreamControllerStream 的控制器,允许发送数据、错误事件、结束事件给 Stream;可以用来检测 Stream 是否已暂停,是否有订阅者,以及变更时获取的回调;小菜分析源码,Stream 很多方法都是通过 StreamController 进行创建的;

      StreamController 默认是对单一数据流进行控制;

factory StreamController(
      {void onListen(),
      void onPause(),
      void onResume(),
      onCancel(),
      bool sync: false}) {
    return sync
        ? new _SyncStreamController<T>(onListen, onPause, onResume, onCancel)
        : new _AsyncStreamController<T>(onListen, onPause, onResume, onCancel);
}

![](https://yqfile.alicdn.com/293573aed20432d01ccd9938f81ef266f6862d55.png

  1. 通过 skinStreamController 中添加数据;
  2. 通过 StreamController.stream 设置 Listener 监听;
  3. 若不设置 StreamController.close() 则不会监听到 onDone 方法,且 close() 之后不可继续添加事件或监听事件;
  4. 使用 StreamController 与单纯的 Listener 方式一样,单一信息流不可多次监听,需要转成广播流;
  5. 如果 Stream 直接监听 onDone 方法和通过 listener 中监听 onDone 方法,以 Stream 直接监听方法为准;

      小菜尝试用 sink 方式向 StreamController 中添加数据,目前最后一个 'test' 是在你 listen 之后设置,依旧可以正常监听,但此时没有监听到 onDone 方法;

var data = [1, 2, '3.toString()', true, true, false, true, 6];
var controller = StreamController();
for (int i = 0; i < data.length; i++) {
  controller.sink.add(data[i]);
}
controller.stream.listen(
    (event) => print('Liste1 -> Stream.fromIterable -> $event'),
    onDone: () => print('onDone -> Stream.fromIterable -> done 结束'));
controller.sink.add('test');

      小菜继续尝试在 'test' 之前调用 StreamController.close() 此时 StreamController 监听的是 close() 之前的数据并提示不能在 close 之后继续添加事件,且可以监听到 onDone 方法;

var data = [1, 2, '3.toString()', true, true, false, true, 6];
var controller = StreamController();
for (int i = 0; i < data.length; i++) {
  controller.sink.add(data[i]);
}
controller.stream.listen(
    (event) => print('Liste1 -> Stream.fromIterable -> $event'),
    onDone: () => print('onDone -> Stream.fromIterable -> done 结束'));
controller.close();
controller.sink.add('test');

      小菜尝试通过 Stream 监听 onDoneListener 中监听 onDone 两种方式,以 Stream 直接监听 onDone 方式为准;

var data = [1, 2, '3.toString()', true, true, false, true, 6];
var controller = StreamController();
for (int i = 0; i < data.length; i++) {
  controller.sink.add(data[i]);
}
controller.stream
    .distinct()
    .listen((event) => print('Liste1 -> Stream.fromIterable -> $event'),
        onDone: () => print('onDone -> Stream.fromIterable -> done 结束'))
    .onDone(() => print('onDone1 -> Stream.fromIterable -> done 结束'));
controller.close();

      小菜测试 StreamController.stream 获取的便是 Stream 可以设置滤重等方法;对于单一订阅流来说,依旧不能进行多个 Listener 监听,需要转换为广播流进行多处监听;

var data = [1, 2, '3.toString()', true, true, false, true, 6];
var controller = StreamController();
for (int i = 0; i < data.length; i++) {
  controller.sink.add(data[i]);
}
Stream stream = controller.stream.distinct();
stream.listen((event) => print('Liste1 -> Stream.fromIterable -> $event'))
    .onDone(() => print('onDone1 -> Stream.fromIterable -> done 结束'));
stream.listen((event) => print('Liste2 -> Stream.fromIterable -> $event'))
    .onDone(() => print('onDone2 -> Stream.fromIterable -> done 结束'));
controller.close();

Stream stream = controller.stream.distinct().asBroadcastStream();
stream.listen((event) => print('Liste1 -> Stream.fromIterable -> $event'))
    .onDone(() => print('onDone1 -> Stream.fromIterable -> done 结束'));
stream.listen((event) => print('Liste2 -> Stream.fromIterable -> $event'))
    .onDone(() => print('onDone2 -> Stream.fromIterable -> done 结束'));
controller.close();


      小菜对 StreamStreamController 的研究依旧很浅显,需要在实际应用中探索,也为 BLoc 的学习做基础;如有错误请多多指导!

来源:阿策小和尚

目录
相关文章
Flutter:Stream.periodic 示例
本文将带您了解在 Flutter中使用Stream.periodic的完整示例 该Stream.periodic构造,顾名思义,是用来创建流,在周期间隔反复广播事件。简单用法:
196 0
|
存储 数据库
Flutter 80: 初识 Flutter Stream (一)
0 基础学习 Flutter,第八十步:学习一下基础 Flutter Stream!
1008 0
|
4月前
|
监控 Dart 安全
创建一个Dart应用,监控局域网上网记录的软件:Flutter框架的应用
在当今数字时代,网络安全变得愈发重要。为了监控局域网上的上网记录,我们可以借助Flutter框架创建一个强大的Dart应用。在这篇文章中,我们将深入讨论如何使用Flutter框架开发这样一个监控局域网上网记录的软件,并提供一些实用的代码示例。
281 1
|
7月前
|
Dart Android开发 UED
带你读《深入浅出Dart》二十七、Flutter路由管理
带你读《深入浅出Dart》二十七、Flutter路由管理
|
10天前
|
Dart 前端开发 开发者
【Flutter前端技术开发专栏】Flutter Dart语言基础语法解析
【4月更文挑战第30天】Dart是Google为Flutter框架打造的高效编程语言,具有易学性、接口、混入、抽象类等特性。本文概述了Dart的基础语法,包括静态类型(如int、String)、控制流程(条件、循环)、函数、面向对象(类与对象)和异常处理。此外,还介绍了库导入与模块使用,帮助开发者快速入门Flutter开发。通过学习Dart,开发者能创建高性能的应用。
【Flutter前端技术开发专栏】Flutter Dart语言基础语法解析
|
10天前
|
Dart 测试技术 UED
Dart 和 Flutter 错误处理指南 | 最佳实践全解析
深入探索 Dart 和 Flutter 中的错误处理技术,从编译时错误到运行时异常,带你学习如何优雅地处理应用程序中的各种意外情况。了解最佳实践,让你的应用程序稳如磐石,用户体验持续优化!
Dart 和 Flutter 错误处理指南 | 最佳实践全解析
|
14天前
|
存储 缓存 开发框架
Flutter的网络请求:使用Dart进行HTTP请求的技术详解
【4月更文挑战第26天】了解Flutter网络请求,本文详述使用Dart进行HTTP请求
|
14天前
|
开发框架 Dart Java
Flutter的核心:Dart语言基础——语法与特性深度解析
【4月更文挑战第26天】Flutter框架背后的Dart语言,以其简洁的语法和独特特性深受开发者喜爱。本文深入解析Dart的语法与特性,如类型推导、动态静态类型系统、统一的类接口、访问权限控制以及并发编程支持。了解并掌握Dart,能助开发者更高效地利用Flutter构建高性能移动应用。
|
3月前
|
Dart JavaScript
Flutter - Dart 基础(数据类型)
【2月更文挑战第3天】
71 1
|
3月前
|
Dart JavaScript 安全