Dart 2:无返回值异步函数选Future<void>还是Future<Null>?区别是什么?
无返回值异步函数:Future 和 Future 该选哪个?
嘿,这个问题问得挺到位的!在Dart里,这俩都是合法的类型,但从语义和最佳实践来看,更推荐用Future<void>,下面给你掰扯清楚两者的区别和实际表现:
核心差异点
void是语义化的标记:它专门用来表示函数"没有返回值",完全贴合我们写无返回值异步函数的意图——就是告诉调用者:这个异步操作干完就完了,不会给你任何结果。Null是具体的类型:它代表的是"值为null的类型",Future<Null>意味着这个Future最终会产出一个null值,语义上更偏向"返回了一个null",而不是"没有返回值"。
不过从运行时的实际表现来看,你写的这段代码确实会两次打印null——因为Dart里的异步函数如果没有显式写return,默认就会返回null,不管你声明的返回类型是Future<void>还是Future<Null>。
代码实测验证
来看你提供的这段代码,运行后控制台会输出两次null:
import 'dart:async'; Future<void> someAsync() async {} Future<Null> otherAsync() async {} main() { someAsync().then((v) => print(v)); otherAsync().then((v) => print(v)); }
最佳实践建议
尤其是在Dart 2.12及以后的空安全版本里,void的语义被强化得更清晰,官方也明确推荐用Future<void>来标记无返回值的异步函数。一方面它更符合代码的表意,另一方面Null类型在空安全下的使用场景被大幅限制,用Future<void>能更好地适配现代Dart的类型系统,避免一些潜在的类型问题。
内容的提问来源于stack exchange,提问作者Rolando Urquiza
相关产品推荐
相关产品推荐

