Flutter 未来<;无效>;异步vs Dart中的简单无效异步

Flutter 未来<;无效>;异步vs Dart中的简单无效异步,flutter,dart,asynchronous,future,Flutter,Dart,Asynchronous,Future,在飞镖中 这两种说法的区别是什么 Future<void> doStuff() async { ... 我知道什么是未来,以及异步/等待通常是如何工作的,但我从未意识到未来是一件事。我有一些未来无处不在的代码,我想用我正常的做事方式来取代它,但我不想破坏任何东西 请注意,这两个函数都使用异步。问题不是“异步函数和非异步函数之间有什么区别?”或者“请您简单尝试一下用Dart解释异步编程好吗?” 我知道已经有一个几乎完全相同的问题了,但是如果你仔细看答案,你会发现没有人真正清楚地回答了

在飞镖中

这两种说法的区别是什么

Future<void> doStuff() async { ...
我知道什么是未来,以及异步/等待通常是如何工作的,但我从未意识到未来是一件事。我有一些未来无处不在的代码,我想用我正常的做事方式来取代它,但我不想破坏任何东西

请注意,这两个函数都使用异步。问题不是“异步函数和非异步函数之间有什么区别?”或者“请您简单尝试一下用Dart解释异步编程好吗?”

我知道已经有一个几乎完全相同的问题了,但是如果你仔细看答案,你会发现没有人真正清楚地回答了这个问题——有什么区别?有什么区别吗?没有区别吗

详述以下两个功能:

// notice there is no warning about not returning anything
Future<void> futureVoid() async {
    await Future.delayed(Duration(seconds: 2), () {
      var time = DateTime.now().toString();
      print('$time : delay elapsed');
    });
}

void nonFutureVoid() async {
    await Future.delayed(Duration(seconds: 2), () {
      var time = DateTime.now().toString();
      print('$time : delay elapsed');
    });
}
//注意,没有关于不返回任何内容的警告
Future futureVoid()异步{
等待未来。延迟(持续时间(秒:2),(){
var time=DateTime.now().toString();
打印(“$time:延迟已过”);
});
}
void非未来void()异步{
等待未来。延迟(持续时间(秒:2),(){
var time=DateTime.now().toString();
打印(“$time:延迟已过”);
});
}
然后使用其onPressed()函数为:

onPressed: () async {
    await nonFutureVoid(); // notce that this await *DOES* delay execution of the proceeding lines.
    var time = DateTime.now().toString();
    print('$time : <-- executed after await statement');
}
onPressed:()异步{
wait nonfuturevid();//注意,这个wait*确实*延迟了正在进行的行的执行。
var time=DateTime.now().toString();

print(“$time:A
void
函数表示该函数不返回任何内容,这意味着您不能对该函数的结果执行操作(并且不能等待它的结果)

同时,
Future
函数返回一个Future对象(其值为
void
)。如果没有
return
语句,将显示
missing\u return
警告(仍可以编译)。您仍然可以通过等待该结果来对其执行操作,但无法实际使用该值,因为它是
无效的


尽管看起来无论你使用什么都可以,但我认为最好对每个
异步
函数使用
未来
,以实现类型安全和更好的维护。

通过编辑,你的问题更有意义。你的问题实际上是关于原则与实践

原则上,返回
void
的函数不同于返回
Future
的函数。一个在概念上表示不返回任何内容的内容,另一个表示异步计算,在完成时可以触发回调

原则上,您不应尝试使用从
void
函数返回的值。这是没有意义的。如果对
等待nonfuturevid();
的代码运行Dart分析器,则在启用时会收到警告

实际上,在某些情况下,尝试使用
void
返回值不会产生错误。这些都是语言中的怪癖(或实现中的错误);您不应该依赖它们。(Dart最初没有一个
void
返回类型。后来添加时,它并没有实现为表示“无值”,而是表示“不允许使用的值”。请参阅。通常,细微的差别并不重要。)

如果您使用Dart 2.12或更高版本并启用空安全性和更严格的类型检查,则能够执行
等待非未来无效();
是一个1,并且该缺陷现在已修复
等待非未来无效();
似乎是一个错误

通过切换“空安全”按钮,可以观察DartPad的新旧行为:



1在GitHub上有很多问题,有很多来回的讨论,所以是的,这是相当令人困惑的。大多数人似乎都同意允许
等待无效
是不可取的。但是

我很确定这是一个我确实回答过的相同问题:我不知道这个问题在那里,thx…不是最大的区别是,实际的差异在注释中散列出来,似乎没有定论。你不能等待空白,你可以等待未来。这就是区别。@NerdyBunz-Huh?答案解释了区别:调用方不能等待异步
void
函数完成。句号。关于不是那样。我预测评论会被删除。:DFuture不需要返回语句。区别只是一个可以等待,另一个不能。我想?我实际上没有意识到这会编译…@shawnblais是的,目前它不是必需的,只是一个警告。你也是对的,
void
函数不能是我等了很久,因为它表明它不会为你的努力回报任何东西。我稍微修正了这个问题。
onPressed: () async {
    await nonFutureVoid(); // notce that this await *DOES* delay execution of the proceeding lines.
    var time = DateTime.now().toString();
    print('$time : <-- executed after await statement');
}
flutter: 2021-02-23 21:46:07.436496 : delay elapsed
flutter: 2021-02-23 21:46:07.437278 : <-- executed after await statement