【发布时间】:2021-07-11 02:28:17
【问题描述】:
两者的主要区别是什么:
Future<void> function(){}Future<Null> function(){}void function() {}funtion(){}
有时我在调用 API 时使用 void 或 future,但我真的不知道主要区别是什么以及何时使用它合适?
【问题讨论】:
两者的主要区别是什么:
Future<void> function(){}Future<Null> function(){}void function() {}funtion(){}有时我在调用 API 时使用 void 或 future,但我真的不知道主要区别是什么以及何时使用它合适?
【问题讨论】:
Future<void> function() {}
定义了一个异步函数,该函数最终什么也不返回,但可以在最终完成时通知调用者。另见:What's the difference between returning void vs returning Future?
Future<Null> function() {}
定义一个异步函数,当它最终完成时最终返回null。不要使用这个;这是Future<void> 的古老形式。它早于 Dart 2 并且是必要的,因为 void 还不是正确的类型,并且没有机制表明 Future 不应该返回任何内容。另见:Dart 2: Legacy of the void
void function() {}
定义一个不返回任何内容的函数。如果函数执行异步工作,调用者将无法直接判断它何时完成。
function() {}
定义一个未指定返回类型的函数。返回类型隐式为dynamic,这意味着该函数可以返回任何内容。不要这样做,因为它没有传达意图;读者将无法判断返回类型是有意还是无意省略的。它还将触发always_declare_return_types lint。如果你真的想返回一个dynamic 类型,你应该明确地使用dynamic function() {}。
【讨论】:
function() {} 之类的函数会返回 null 指针值。
当您的函数不返回任何内容且未标记为 async 时,请使用此原型:function() { // <- not async
// ... some code
// ... don't use return
}
void function() {} sintaxis 指定不返回值。 function() {} 也是一样,但是如果你在调用后尝试赋值,你会在编译时得到一个错误:Error: This expression has type 'void' and can't be used.
就个人而言,如果您确实没有返回值并且函数不是异步的,我推荐这种方法。
请注意,您可以在普通函数和异步函数中使用void。
Future<void> function() async {} 之类的函数用于返回 Future<void> 对象的异步函数。我个人推荐 void function() async {} 仅当您在调用函数时不使用 await 或 then,否则使用 Future <void> function() async {}。
一个例子:
Future<void> myFunction() async {
await Future.delayed(Duration(seconds: 2));
print('Hello');
}
void main() async {
print(myFunction()); // This works and prints
// Instance of '_Future<void>'
// Hello
// Use this approach if you use this:
myFunction().then(() {
print('Then myFunction call ended');
})
// or this
await myFunction();
print('Then myFunction call ended');
}
void myFunction() async {
await Future.delayed(Duration(seconds: 2));
print('Hello');
}
void main() async {
print(myFunction()); // This not works
// The compile fails and show
// Error: This expression has type 'void' and can't be used.
// In this case you only can call myFunction like this
myFunction();
// This doesn't works (Compilation Error)
myFunction().then(() {
print('Then myFunction call ended');
});
// This doesn't works (Compilation Error)
await myFunction();
print('Then myFunction call ended');
}
Future<Null> function() async {} 的函数返回一个Future<null> 对象。每当您返回 null 时使用它。不建议使用它,因为 Null 类不是从 Object 扩展而来,并且您返回的任何内容都标记错误(返回 null 或显式 null 值的语句除外):Future<Null> myFunction() async {
await Future.delayed(Duration(seconds: 2));
print('Hello');
// Ok
return (() => null)();
// Ok
return null;
}
【讨论】: