例如,我有这个未来的功能:
Future<void> sayHello() async {
await service.sayHello();
}
我想在单击按钮时调用它
ElevatedButton(
onPressed: () => sayHello(),
child: const Text("Click"),
)
我的问题是,当我想在单击时调用未来的函数时, onPressed 应该是异步的吗?无论如何它可以是异步的吗?
如果你想像这样调用你的函数:
ElevatedButton(
onPressed: () => sayHello(),
child: const Text("Click"),
)
不,你不需要为 onPressed 设置
async
,但如果你想这样调用它:
ElevatedButton(
onPressed: () async{
var result = await sayHello()
},
child: const Text("Click"),
)
您需要致电
async
,因为您需要await
。
点击按钮
ElevatedButton(
onPressed: () async => sayHello(),
child: const Text("Click"),
),
未来功能:
Future<void> sayHello() async {
await service.sayHello();
}
正如@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 任务将会很酷。