【问题标题】:Why even after putting await keyword my app will show 0?为什么即使在输入 await 关键字后,我的应用程序仍会显示 0?
【发布时间】:2020-07-15 22:41:28
【问题描述】:

我在 initState 函数中调用了触发函数。在触发函数中,我将从 API 获取数据,并使用 storeddata.fromjson 函数解析数据。然后我会将这些值存储在变量中。据我所知,一旦创建了这个有状态小部件的对象,就会调用 initState 函数。但仍然在应用程序中,它会在几秒钟内将 exchangeval_bitcoin 显示为 0,然后它会被更新(我已将 exchangeval_bitcoin 初始化为 0)。这是否意味着即使在输入 await 关键字之后,也会在 initState 函数完成之前调用 build 函数?在更新该值之前如何实现加载屏幕?

void triggerfun() async {
var decodedmap;
Jsonparse p = Jsonparse(url: uri);
decodedmap = await p.cryptocovert();
Storeddata s = Storeddata.fromjson(decodedmap);
setState(() {
  exchangeval_bitcoin = s.getdataforbitcoin();
  exchangeval_etherium = s.getdataforetherium();
  exchangeval_litecoin = s.getdataforlitecoin();
});
permanent = s;
}

//calling initstate
@override
void initState() {
super.initState();
triggerfun();
}

提前致谢。

【问题讨论】:

    标签: asynchronous flutter async-await future futuretask


    【解决方案1】:

    triggerfun() 是一个异步函数。因此,在您的 initState() 中,它将调用 triggerfun(),但仍继续执行程序的其余部分。当触发函数完成后,它将设置状态并重建小部件。

    await 关键字将停止程序,直到该行完成,但 triggerfun() 整体上仍然是异步的。

    【讨论】:

    • 哦,好的,我现在明白了。关于如何在设置这些变量之前显示加载屏幕的任何想法? (我应该如何将持续时间设置为确切的持续时间未知)
    • 所以我假设你的应用程序的构建部分显示了硬币价格。我可能会做一些事情,比如将 state 中的 exchangeval_bitcoin 设置为 null。在构建部分,如果 exchangeval_bitcoin 为空,则显示加载小部件。这里的想法是您不知道需要多长时间,因此如果变量为空,只需显示加载小部件。一旦变量更新,您在 triggerfun() 中的 setState 将使用这些变量的新值重建您的小部件。
    • 知道了。好主意。谢谢。
    • Flutter 一天比一天有趣。但唯一的问题是我在创建 UI 时会感到不舒服。我觉得在创作时没有绝对的控制和意识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多