Dart 语言 如何在 Dart 中有效使用 Stream 和 Future

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


摘要:

在 Dart 中,异步编程是构建高效应用程序的关键。Stream 和 Future 是 Dart 中处理异步操作的两个核心概念。本文将深入探讨 Dart 中 Stream 和 Future 的使用方法,包括它们的创建、转换、组合以及在实际应用中的最佳实践。

一、

异步编程在现代应用程序中扮演着重要角色,它允许程序在等待某些操作完成时继续执行其他任务。Dart 提供了 Stream 和 Future 两种机制来处理异步操作。Stream 用于处理一系列连续的事件,而 Future 用于处理单个异步操作的结果。

二、Future

Future 是 Dart 中用于表示异步操作结果的类型。它代表一个尚未完成的操作,当操作完成时,会返回一个值或抛出一个异常。

1. 创建 Future

dart

Future<String> fetchData() async {


// 模拟异步操作,例如从网络获取数据


await Future.delayed(Duration(seconds: 2));


return 'Data fetched';


}

void main() {


fetchData().then((value) {


print(value); // 输出: Data fetched


});


}


2. Future 的转换

Dart 提供了多种方法来转换 Future,例如 `then`、`catchError`、`whenComplete` 和 `async`/`await`。

dart

Future<String> fetchDataWithError() async {


// 模拟可能抛出异常的异步操作


await Future.delayed(Duration(seconds: 2));


throw Exception('Failed to fetch data');


}

void main() {


fetchDataWithError().then((value) {


print(value);


}).catchError((error) {


print(error); // 输出: Failed to fetch data


});


}


3. Future 的组合

可以使用 `Future.wait` 来组合多个 Future,等待所有 Future 完成。

dart

void main() {


Future.wait([


fetchData(),


fetchDataWithError(),


]).then((values) {


print(values); // 输出: [Data fetched, Failed to fetch data]


});


}


三、Stream

Stream 是 Dart 中用于处理一系列连续事件的类型。它可以看作是一个可以产生多个值的序列。

1. 创建 Stream

dart

Stream<String> createStream() async {


await Future.delayed(Duration(seconds: 1));


yield 'Event 1';


await Future.delayed(Duration(seconds: 1));


yield 'Event 2';


}

void main() {


Stream<String> stream = createStream();


stream.listen((event) {


print(event); // 输出: Event 1, Event 2


});


}


2. Stream 的转换

Dart 提供了多种方法来转换 Stream,例如 `map`、`where`、`async` 和 `StreamBuilder`。

dart

Stream<String> createStreamWithFilter() async {


await Future.delayed(Duration(seconds: 1));


yield 'Event 1';


await Future.delayed(Duration(seconds: 1));


yield 'Event 2';


}

void main() {


Stream<String> filteredStream = createStreamWithFilter().where((event) => event.startsWith('Event'));


filteredStream.listen((event) {


print(event); // 输出: Event 1, Event 2


});


}


3. Stream 的组合

可以使用 `Stream.merge` 来合并多个 Stream,创建一个包含所有事件的 Stream。

dart

void main() {


Stream<String> stream1 = createStream();


Stream<String> stream2 = Stream.periodic(Duration(seconds: 1), (count) => 'Event $count');


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


mergedStream.listen((event) {


print(event); // 输出: Event 1, Event 2, Event 0, Event 1, Event 2, ...


});


}


四、最佳实践

1. 使用 `async`/`await` 来简化 Future 的处理。

2. 使用 `try-catch` 来处理异步操作中的异常。

3. 使用 Stream 的转换方法来创建复杂的异步逻辑。

4. 使用 `StreamBuilder` 来构建依赖于 Stream 的 UI。

五、结论

Stream 和 Future 是 Dart 中处理异步编程的两个强大工具。通过理解它们的创建、转换和组合,开发者可以构建出高效、响应迅速的应用程序。本文深入探讨了 Dart 中 Stream 和 Future 的使用,希望对读者有所帮助。