Dart 语言 Stream控制器事件流

Dart阿木 发布于 2025-06-19 5 次阅读


Dart Stream 控制器事件流详解与实战

在 Dart 语言中,Stream 是一种用于异步编程的数据流,它允许你以声明式的方式处理异步数据。Stream 控制器是 Stream 的重要组成部分,它负责管理 Stream 的事件流,包括数据发送、错误处理和关闭等。本文将围绕 Dart Stream 控制器事件流这一主题,详细介绍其概念、用法以及在实际开发中的应用。

Stream 控制器概述

Stream 控制器是 Stream 的核心,它负责处理 Stream 中的事件。Stream 控制器可以发送数据(onData)、触发错误(onError)和关闭流(onDone)。在 Dart 中,Stream 控制器通常通过 StreamController 类来实现。

StreamController 类

StreamController 类提供了创建和管理 Stream 控制器的功能。以下是一些 StreamController 类的主要方法:

- `add(data)`: 向 Stream 中添加数据。

- `addError(error, [stackTrace])`: 向 Stream 中添加错误。

- `close()`: 关闭 Stream,不再发送任何事件。

Stream 控制器事件流

Stream 控制器的事件流包括以下几种类型:

- `onData`: 当有数据被添加到 Stream 时触发。

- `onError`: 当 Stream 中发生错误时触发。

- `onDone`: 当 Stream 被关闭时触发。

Stream 控制器事件流实战

下面将通过几个示例来展示如何使用 Stream 控制器来处理事件流。

示例 1:简单的数据流

dart

void main() {


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

// 添加数据


controller.add('Hello');


controller.add('World');

// 监听事件


controller.stream.listen((data) {


print(data);


});

// 关闭流


controller.close();


}


示例 2:错误处理

dart

void main() {


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

// 添加数据


controller.add('Hello');


controller.addError('An error occurred');

// 监听事件


controller.stream.listen((data) {


if (data is String) {


print(data);


} else if (data is Error) {


print('Error: ${data.runtimeType}');


}


});

// 关闭流


controller.close();


}


示例 3:异步数据流

dart

void main() async {


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

// 异步添加数据


await Future.delayed(Duration(seconds: 1), () {


controller.add('Hello');


});

await Future.delayed(Duration(seconds: 2), () {


controller.add('World');


});

// 监听事件


controller.stream.listen((data) {


print(data);


});

// 关闭流


controller.close();


}


Stream 控制器的高级用法

Stream 控制器除了基本的事件流处理外,还有一些高级用法,如下所示:

使用 `onListen` 和 `onCancel` 处理监听器订阅和取消订阅

dart

void main() {


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

// 监听器订阅


controller.stream.listen((data) {


print('Data: $data');


}, onListen: () {


print('Listener subscribed');


}, onCancel: () {


print('Listener cancelled');


});

// 添加数据


controller.add('Hello');

// 取消监听器


controller.close();


}


使用 `sync` 和 `async` 控制器

Dart 提供了 `SyncStreamController` 和 `AsyncStreamController` 两种控制器,分别用于同步和异步事件流。

dart

void main() {


// 同步控制器


SyncStreamController<String> syncController = SyncStreamController<String>();

syncController.add('Hello');


syncController.add('World');

syncController.stream.listen((data) {


print(data);


});

// 异步控制器


AsyncStreamController<String> asyncController = AsyncStreamController<String>();

asyncController.add('Hello');


asyncController.add('World');

asyncController.stream.listen((data) {


print(data);


});


}


总结

Stream 控制器是 Dart 中处理异步数据流的重要工具。通过 Stream 控制器,我们可以轻松地发送数据、处理错误和关闭流。本文详细介绍了 Stream 控制器的概念、用法以及在实际开发中的应用,并通过示例展示了如何使用 Stream 控制器来处理事件流。希望本文能帮助你更好地理解 Dart Stream 控制器事件流,并在实际项目中灵活运用。