Dart异步函数返回Future<String?>?而非Future<String?>的原因探究
为什么IDE给这段异步函数生成了
Future<String?>?的返回类型? Dart异步函数的关键规则:只要是加了
async关键字的函数,不管你return的是普通值还是null,Dart都会自动把返回值包装成Future对象返回。也就是说,这个函数绝对不可能直接返回null(非Future类型的null),它的返回值必然是一个Future实例。IDE快速修复的误判问题:VSCode和Android Studio的“Add return type”功能是基于代码里的字面返回值做静态推断的,它看到你写了
return null,就错误地觉得函数可能返回null,于是生成了Future<String?>?这种带外层可空标记的类型。但实际上这个外层的?完全是多余的,不符合Dart异步函数的语义,属于工具的过度保守推断。正确的返回类型应该是
Future<String?>:这里的String?表示这个Future最终完成时,会返回字符串或者null;而外层不需要加?,因为异步函数必然会返回一个Future对象,不可能返回null。
修正后的代码:
Future<String?> returnStringOrNull() async { return Random().nextBool() ? "OK" : null; }
内容的提问来源于stack exchange,提问作者Adwiv
相关产品推荐
相关产品推荐

