在按钮单击 Flutter 时调用异步方法

问题描述 投票:0回答:3

例如,我有这个未来的功能:

Future<void> sayHello() async {
   await service.sayHello();
}

我想在单击按钮时调用它

ElevatedButton(
    onPressed: () => sayHello(),
    child: const Text("Click"),
)

我的问题是,当我想在单击时调用未来的函数时, onPressed 应该是异步的吗?无论如何它可以是异步的吗?

flutter asynchronous future
3个回答
2
投票

如果你想像这样调用你的函数:

ElevatedButton(
    onPressed: () => sayHello(),
    child: const Text("Click"),
)

不,你不需要为 onPressed 设置

async
,但如果你想这样调用它:

ElevatedButton(
    onPressed: () async{
      var result = await sayHello()
    },
    child: const Text("Click"),
)

您需要致电

async
,因为您需要
await


1
投票

点击按钮

 ElevatedButton(
                    onPressed: () async => sayHello(),
                    child: const Text("Click"),
                  ),

未来功能:

Future<void> sayHello() async {
   await service.sayHello();
}

0
投票

正如@Suchin Kumawat 所说,两种情况都可以。

每当您要在函数体中使用

await
运算符时,您都应该将其定义为
async
。请参阅异步编程。更具体地请参阅使用 futures:异步和等待,因为它涵盖了这个主题。

但是

注意,

onPressed
会被 Flutter 同步调用。因此,如果您的
onPressed
身体应该又长又重 ,请考虑不要在其中使用
await
。否则,您会在 UI 中遇到滞后和冻结帧的情况。

相反,您可以调用

async
函数,但不要等待其
Future
对象。只需让 Flutter 在 UI 任务之间安排它即可。

例如,您可以执行以下操作:

onPressed: () => Future.delayed(const Duration(seconds: 0), () {
  // Do heavy staff here
});

Future.delayed(/*with 0 delay*/)
的结果将是..一个
Future
对象。这是 Flutter 的一项任务,将在最近的将来安排。所以当前的 UI 任务将会很酷。

© www.soinside.com 2019 - 2024. All rights reserved.