flutter - 如何在异步功能后更改 UI?
问题描述
这是我想做的:
我有一个函数 InitMyContext() 需要一些时间才能完成。我想在此功能运行时显示我的加载小部件,然后显示另一个小部件。
我想出的想法是有一个全局键,当加载键的值为 0 并且在我的 InitMyContext() 结束时将键的值更改为 1。这是我现在的代码:
keyInitMyCtx = 0;
Widget build(BuildContext context) {
initMyContext();
if (keyInitMyCtx == 0) {
return LoadingScreen(text: 'Loading...');
} else {
return WidgetScreen();
}
}
void initMyContext() async {
keyInitMyCtx = 0;
await Future.delayed(Duration(seconds: 4)); // Simulate 4 seconds of delay
keyInitMyCtx = 1;
}
但问题是,我不能执行 SetState() 来重绘 BuildContext() 并显示 WidgetScreen,因为 SetState() 不能异步等待 initMyContext() 结束。我的想法不多了,有人有什么建议吗?
我希望我没有错过一些明显的东西,谢谢阅读
解决方案
您不应该在build
函数中等待 4 秒。您的构建功能应该尽可能快。
你最好像这样构造你的代码:
class YourWidget {
initState() {
keyInitMyCtx = 0;
Timer(const Duration(seconds: 4), () {
setState(() {
keyInitMyCtx = 1;
});
});
}
}
这样,您的构建函数将用 0 调用,然后 4 秒后用 1 调用
推荐阅读
- python - 如何将 unicode 转换为可读字符串?
- django - 在 Django 项目中出现“MultiValueDictKeyError at /button/'text”错误
- ios - 如何在不损失质量的情况下放大微小的文本图像?
- laravel - 我在 laravel 的资源中没有元数据
- postgresql - postgres如何查询ltree以匹配前两个标签
- google-apps-script - 带有标准的脚本复制/粘贴
- scala - 将包含链式函数调用的枚举传递给 Scala 中的 for...yield 理解
- python - 寻找以下代码的解释,了解如何找到长方体的坐标?
- arrays - 通过键在关联数组中搜索
- reactjs - 反应 js 中的 AWS polly(文本到语音)。无法获取 AWS 上下文以提供凭据