Dart 语言 Stream控制器与事件流处理实践

Dart阿木 发布于 2025-06-18 12 次阅读


Dart 语言 Stream 控制器与事件流处理实践

在 Dart 语言中,Stream 是一种用于异步编程的强大工具。它允许开发者以声明式的方式处理事件流,使得异步编程变得更加直观和易于管理。Stream 控制器是 Stream 的重要组成部分,它负责生成、修改和消费 Stream 中的数据。本文将围绕 Dart 语言中的 Stream 控制器与事件流处理实践展开,通过一系列示例代码,深入探讨 Stream 的使用方法。

Stream 简介

在 Dart 中,Stream 是一个异步序列,它允许数据以事件的形式被发送和接收。Stream 有两种类型:Stream<类型> 和 Stream<String>。Stream<类型> 表示流中的数据是特定类型的对象,而 Stream<String> 表示流中的数据是字符串。

Stream 的主要操作包括:

- `add(E event)`:向 Stream 中添加一个事件。

- `onError(error)`:当 Stream 发生错误时,调用此方法。

- `onClose()`:当 Stream 关闭时,调用此方法。

- `onData(Function event)`:当 Stream 接收到数据时,调用此方法。

Stream 控制器

Stream 控制器是 Stream 的核心,它负责生成和修改 Stream 中的数据。Dart 提供了多种 Stream 控制器,包括:

- `StreamController`:创建一个新的 Stream 控制器。

- `Stream.fromIterable(Iterable)`:从可迭代对象创建一个 Stream。

- `Stream.fromFuture(Future)`:从 Future 创建一个 Stream。

- `Stream.periodic(Duration period, Function tick)`:创建一个周期性 Stream。

以下是一些 Stream 控制器的实践示例:

1. 创建 Stream 控制器

dart

void main() {


StreamController<String> controller = StreamController<String>();

// 添加数据到 Stream


controller.add('Hello');


controller.add('World');

// 监听 Stream


controller.stream.listen((event) {


print(event);


});

// 关闭 Stream


controller.close();


}


2. 从 Future 创建 Stream

dart

void main() {


Future<String> future = Future.delayed(Duration(seconds: 2), () => 'Done');

Stream<String> stream = Stream.fromFuture(future);

stream.listen((event) {


print(event);


});


}


3. 周期性 Stream

dart

void main() {


Stream<String> stream = Stream.periodic(Duration(seconds: 1), (int count) {


return 'Tick $count';


});

stream.listen((event) {


print(event);


});

// 等待 5 秒后关闭 Stream


Future.delayed(Duration(seconds: 5), () {


stream.close();


});


}


事件流处理实践

在实际应用中,事件流处理是 Stream 的核心应用场景。以下是一些常见的事件流处理实践:

1. 数据流处理

dart

void main() {


Stream<String> stream = Stream.fromIterable(['a', 'b', 'c', 'd']);

stream


.map((event) => event.toUpperCase())


.where((event) => event.length > 1)


.listen((event) {


print(event);


});


}


2. 错误处理

dart

void main() {


Stream<String> stream = Stream.fromIterable(['a', 'b', 'c', 'd']);

stream


.map((event) => event.toUpperCase())


.catchError((error) {


print('Error: $error');


})


.listen((event) {


print(event);


});


}


3. Stream 合并

dart

void main() {


Stream<String> stream1 = Stream.fromIterable(['a', 'b', 'c']);


Stream<String> stream2 = Stream.fromIterable(['d', 'e', 'f']);

Stream<String> combinedStream = Stream.merge([stream1, stream2]);

combinedStream.listen((event) {


print(event);


});


}


总结

Stream 控制器与事件流处理是 Dart 语言中异步编程的重要组成部分。通过 Stream,开发者可以以声明式的方式处理异步事件,使得代码更加简洁和易于维护。本文通过一系列示例代码,展示了 Stream 控制器的使用方法以及事件流处理的实践。希望这些内容能够帮助读者更好地理解和应用 Dart 中的 Stream。