Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 在Dart中将方法引用作为异步调用传递_Asynchronous_Dart - Fatal编程技术网

Asynchronous 在Dart中将方法引用作为异步调用传递

Asynchronous 在Dart中将方法引用作为异步调用传递,asynchronous,dart,Asynchronous,Dart,是否可以将async方法作为Dart中的async调用传递 例如,如果我想简化此代码: 。。。 void myFunc()异步{ 等待myLib.work(); } ... 升起的按钮( onPressed:()异步{await myFunc();}, ) 为此: 。。。 void myFunc()异步{ 等待myLib.work(); } ... 升起的按钮( onPressed:myFunc, ) 将myFunc作为引用传递,并且仍然保持每次作为回调从onPressed调用myFunc时

是否可以将
async
方法作为Dart中的
async
调用传递

例如,如果我想简化此代码:

。。。
void myFunc()异步{
等待myLib.work();
}
...
升起的按钮(
onPressed:()异步{await myFunc();},
)
为此:

。。。
void myFunc()异步{
等待myLib.work();
}
...
升起的按钮(
onPressed:myFunc,
)

myFunc
作为引用传递,并且仍然保持每次作为回调从
onPressed
调用
myFunc
时,它将是一个异步调用。

简言之:是。您展示的两段代码几乎完全相同。调用
myLib.work
并在调用的异步计算完成时完成未来。 你也可以这样写:

RaisedButton(
  onPressed: myLib.work, 
)
它仍然会做同样的事情

然而,我不能绝对肯定我理解你所说的“异步调用”是什么意思

Dart函数对象不分为异步函数和非异步函数,它们的调用方式不同。它们可以分为返回的
Future
s和不返回的
s,但您可以用相同的方式调用它们。我假设
myLib.work
返回一个
Future
。然后,您可以选择等待结果,但这不是调用的一部分

调用函数本身并不是异步的,它总是同步的——它在计算继续之前返回一个值。该值可能是未来的
,在异步计算完成后将完成,但函数将同步返回

因此,当您将
void Function()
方法绑定到
onPressed
事件时,它最终将调用该函数,忽略返回值,并同步继续

如果该函数是
myLib.work
,则它调用
myLib.work
,并忽略返回的
Future
。当
work
的异步工作完成时,它将完成返回的未来,没有人会注意到

如果函数是
myFunc
,那么它会调用
myFunc
,它会立即调用
myLib.work
,并记住返回的未来。然后
myFunc
同步返回一个新的
Future
(被忽略),并开始等待
myLib.work
返回的Future(因为
wait
)。当该future完成时,
wait
完成,然后
myFunc
主体完成,最后新的
future
也完成。同样,没有人注意到

如果函数是
()async=>wait myFunc()
,则调用该函数。它立即调用
myFunc
,它立即调用
myLib.work
,它返回一个
myFunc
开始等待的
Future
,然后返回一个
Future
,函数表达式开始等待,然后返回一个
Future
,然后将其忽略。 最终所有这些功能都完成了,没有人注意到


“如果一个未来完成了,没有人在听,它会成为一个事件吗?”

Hmm。。。。我想我的整个困惑是因为缺少关于
Future
s的文档,这些文档不是等待的,只是创建的,留给事件循环来处理它们。我看到的所有文档都有一个
wait
then