如何通过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
相关产品推荐
相关产品推荐

