为什么声明返回Future的Dart async函数可直接返回非Future类型对象
async关键字的隐式返回值包装规则
这是Dart语言针对async函数的内置语法特性,核心规则如下:
- 所有标记了
async关键字的函数,返回值类型必须是Future(或者void,属于特殊情况) - 你在
async函数内用return返回的普通非Future类型值,编译器会自动为你包装成对应的Future对象,不需要手动封装。
对应你给出的代码示例:
函数声明的返回类型为Future<List<Rate>>,你在函数体内实际返回的是List<Rate>类型的list变量,因为加了async关键字,编译器会自动把list包装为Future.value(list),最终返回的对象类型和声明的返回类型完全匹配,因此不会报错。
如果移除async关键字,编译器就不会执行上述自动包装逻辑,你直接返回List<Rate>类型的值和声明的Future<List<Rate>>返回类型不匹配,就会触发类型不匹配的编译错误。
你可以运行你给出的代码验证这个特性,控制台的输出顺序如下:
after fetchExchangeRates fetchExchangeRates returns
这个输出顺序也能证明fetchExchangeRates返回的确实是异步的Future对象,调用后不会阻塞后续代码的执行,函数体内的逻辑会被异步调度执行。
内容的提问来源于stack exchange,提问作者ximmyxiao
相关产品推荐
相关产品推荐

