在 Flutter(以及 Flutter 使用的语言 Dart)中,async
和async*
都用于处理异步操作,但它们的用途和使用环境不同。以下是它们之间的区别:
async
- 目的 :用于定义返回
Future
的异步函数。 - 行为 :
async
函数异步执行,最终返回单个值(或错误)。你可以在函数内部使用 await 来等待其他异步操作完成。 - 返回类型 :隐式返回一个
Future<T>
,其中T
是函数返回值的类型。 - 用例:适用于产生单一结果的一次性操作,例如从 API 获取数据或读取文件。
异步示例:
dart
Future< String > fetchData() async {
await Future.delayed( Duration (seconds: 2 ));
// 模拟延迟
return "Hello Wolld!" ;
}
void main() async {
String result = await fetchData();
print (result); // 打印: Hello Wolld!
}
async*
- 目的 :用于定义一个函数,该函数随时间异步生成一系列值,并返回一个
Stream
。 - 行为 :
async*
函数是一个生成器,它使用关键字一次生成一个值yield
。它生成一个可以监听值的流。 - 返回类型 :隐式返回
Stream<T>
,其中T
是产生的每个值的类型。 - 用例:非常适合需要随时间产生多个值的场景,例如流数据、循环处理或处理实时更新。
async*的示例:
csharp
Stream< int > countDown( int from) async * {
for ( int i = from; i >= 0 ; i--) {
await Future.delayed( Duration (seconds: 1 ));
// 模拟延迟
yield i; // 每次产生一个值
}
}
void main() {
countDown( 3 ).listen((value) {
print (value); // 打印:3、2、1、0(每秒一个)
});
}
这里,countDown
是一个async*
返回 的函数Stream<int>
。yield
关键字在每个值可用时将其发送到流。
主要区别

使用哪个?
async
当您需要执行单个异步任务并返回一个结果(例如,获取单个 API 响应)时使用。async*
当您需要随时间异步发出多个值时使用(例如,流式传输传感器数据或生成具有延迟的序列)。