You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Stream监听List的新增元素通知

如何用Stream监听Dart列表的新元素添加事件

要实现列表新增元素时通过Stream通知监听器,普通的List并没有内置的事件通知机制,我们可以借助StreamController来手动触发事件。以下是修改后的完整实现:

完整代码

import 'dart:async';
import 'dart:math';

List<String> names = ['matt', 'luke', 'sam'];
// 创建StreamController,用来管理流和发送新元素事件
final StreamController<String> _nameAddedController = StreamController<String>();

// 对外暴露只读的Stream,避免外部随意发送事件
Stream<String> get onNameAdded => _nameAddedController.stream;

void addNamesToNameList() async {
  Random random = Random();
  int len = 4;
  while(true) {
    String newName = String.fromCharCodes(
      List.generate(len, (index) => random.nextInt(33) + 89)
    );
    names.add(newName);
    print("Added $newName to names list");
    // 发送新元素到Stream,通知所有监听器
    _nameAddedController.add(newName);
    // 改用异步延迟,避免阻塞主线程导致Stream回调无法及时执行
    await Future.delayed(const Duration(seconds: 3));
  }
}

void main() {
  // 监听Stream,处理新添加的元素
  onNameAdded.listen((newName) {
    print("监听到新元素:$newName");
  });

  addNamesToNameList();

  // 注意:若程序有退出逻辑,需调用以下代码关闭控制器,避免内存泄漏
  // _nameAddedController.close();
}

关键说明

  • StreamController的作用:作为Stream的管理核心,负责创建数据流、发送事件(add方法),还可处理错误和完成信号。
  • 只读Stream暴露:通过get onNameAdded仅对外提供Stream对象,防止外部代码随意发送事件,保证数据流的可控性。
  • 替换同步阻塞操作:原代码中的sleep是同步阻塞方法,会卡住主线程导致Stream监听回调无法及时执行,改用Future.delayed异步延迟可让事件循环正常处理其他任务。
  • 资源清理:如果程序并非无限循环,需在合适时机调用_nameAddedController.close()关闭控制器,避免内存泄漏。

内容的提问来源于stack exchange,提问作者OBurnsy22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:55:22