【问题标题】:In flutter, how to trigger something strictly after an async function is done executing?在颤振中,如何在异步函数执行完成后严格触发某些事情?
【发布时间】:2021-01-05 03:58:37
【问题描述】:

假设我有一个_mode 属性,我想在按下按钮时更改setState()。

当按钮被按下时(onPressed),我正在调用这个函数,

Future <void> changeMode() async {
    _result = await getResult(); // Returns a result. I want the mode to change AFTER the result is returned
    setState((){
         _mode = Modes.OFF; 
    });
}

最终发生的事情是,_mode 在 getResult() 执行完成之前被更改。我该如何解决这个问题?

【问题讨论】:

  • 将changeMode 标记为异步。
  • @AdnanAlshami 试过了,不行

标签: flutter dart asynchronous async-await


【解决方案1】:

在函数内部使用 await 时,该函数有阻塞主线程的危险,因此必须将其标记为异步。

用async 标记你的函数,它应该可以工作。你的状态设置函数也应该是setState()的参数。

Future<void> changeMode() async {
    _result = await getResult(); // Returns a result. I want the mode to change AFTER the result is returned
    setState(() {     
      _mode = Modes.OFF;    
    });
}

【讨论】:

  • 你的setState也应该是setState(() { _mode = Modes.OFF; });
  • 我的错,复制时错过了。是setState(() { _mode = Modes.OFF; });
  • 尝试使用 await new Future.delayed(const Duration(seconds: 5)); 更改您的 await 行,并查看 5 秒后状态是否更改。如果是,那么问题出在您的getResult() 中,否则在此特定功能之外。它应该根据您共享的数据工作。
  • 知道了。谢谢。确实是我的getResult() 有错
  • 这个解释是错误的。 await 不会阻塞主线程。 await 甚至不是合法的语法没有 将函数标记为async,并且异步函数的要点是它们不会阻塞。 await 是用于设置 Future.then 回调的语法糖。
猜你喜欢
  • 1970-01-01
  • 2021-06-02
  • 2019-07-19
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多