Dart面试题更新 2026-08-03

在 Dart 异步编程中,Stream 的创建与使用方式是什么?StreamController 在其中起到哪些核心作用?

考察说明

考查对 Dart 异步数据流 Stream 的创建、监听及 StreamController 角色的掌握程度。

回答思路

  1. 【回答框架 1】Stream 是 Dart 中用于异步事件序列的抽象,可连续发出多个值或错误,并通过 onDone 通知结束。创建方式包括从集合生成(如 Stream.fromIterable)、使用异步生成器 async* 配合 yield、或通过 StreamController 手动控制事件。
  2. 【回答框架 2】StreamController 是一个控制 Stream 的入口,它提供 sink 属性用于添加事件(add、addError、close),并暴露 stream 属性以供外部监听。可以通过它创建单订阅流(默认)或广播流(broadcastController),广播流允许多个监听者。
  3. 【回答框架 3】使用 Stream 时常用 listen 方法监听事件流,处理数据、错误及完成回调;也可结合 await for 在异步函数中遍历。注意普通 Stream 只能被监听一次,广播流可多次监听但需要手动管理订阅与取消。
  4. 【回答框架 4】取消订阅使用 StreamSubscription 的 cancel 方法避免内存泄漏;同时可结合 StreamTransformer 或 map、where 等操作符对数据进行变换与过滤,形成响应式的数据管道。
  5. 【回答框架 5】StreamController 的价值在于它把事件产生和消费解耦,便于在业务中将异步事件源(如用户操作、网络响应)封装成标准数据流,供上层灵活监听与处理。
  6. 【关键点 1】Stream 是异步事件序列,创建方式有 Stream.fromIterable、async* 生成器及 StreamController。
  7. 【关键点 2】StreamController 通过 sink 添加事件、stream 暴露可监听流,可分单订阅与广播两类。
  8. 【关键点 3】使用 listen 或 await for 消费事件,注意单订阅流只能监听一次。
  9. 【关键点 4】StreamSubscription 需要 cancel 以释放资源。
  10. 【关键点 5】可用 map、where 等操作符组合处理数据流。
  11. 【易错点 1】将普通 Stream 当作可多监听使用,重复监听会抛出异常。
  12. 【易错点 2】忘记取消订阅导致内存泄漏或事件泄漏。
  13. 【易错点 3】在广播流中手动管理订阅,未及时 cancel 引起多次触发。