【问题标题】:How to await async initialisation code in initState() [duplicate]如何在 initState() 中等待异步初始化代码 [重复]
【发布时间】:2021-07-25 01:01:58
【问题描述】:

我有一些代码需要在我的initState() 方法中运行,因为它会在构建方法中初始化一个后期变量小部件依赖。问题是我要运行的方法是异步的,因为我正在使用 Shared Preferences 包从磁盘加载数据。我尝试使该方法异步,但我的 IDE 中出现错误,指出 initState() 方法不能是异步的。我尝试查找解决方案,他们说您可以运行它们而无需等待 initState() 方法。我试过这个,但问题是它没有等待初始化,所以我得到红色错误屏幕,说变量尚未初始化。我原本打算在处理数据的自定义类的构造函数中运行它,但我也收到一个错误,说构造函数方法不能是异步的。

我的 IDE 建议使用 didChangeDependencies(),因为它可以是异步的,但是构建方法不会等待它。

我尝试了这个问题 (Is there a way to load async data on InitState method?) 中没有建议 StreamBuilder 的所有答案,因为我没有尝试加载与身份验证有关的流。我还尝试在代码等前后更改调用super.initState();的顺序,但没有奏效。

【问题讨论】:

  • 该链接包含如何使用 FutureBuilder 的示例。没有办法拥有异步 initState(或其他 init)方法,您必须在小部件中处理异步。
  • @nvoigt 除了 initState 方法之外,还有其他方法可以运行一些初始化代码吗?我有一个需要从小部件所依赖的磁盘加载的变量。我不需要特别使用 initState 只需要让构建方法等待一个变量加载。感谢您的帮助。
  • @nvoigt 使用 FutureBuilder 工作,我仍然得到一个异常但应用程序中没有红屏。异常是一个问题还是你知道我该如何解决它?我得到的例外是 late 变量尚未初始化。
  • 好吧,你不能让它“迟到”,这应该消除异常。
  • 好的,感谢您的帮助!

标签: flutter dart asynchronous async-await


【解决方案1】:

创建一个异步函数并在其中执行异步工作.. 然后在 initState 中调用它而不使用 async await 关键字,但像这样

 @override
  void initState() {
    checkLoggedIn().then((user) {
    
     // do anything with your data here
   
    });
    super.initState();
  }

【讨论】:

  • 我仍然遇到同样的问题。一旦加载数据,我不会尝试对数据做任何事情,我只想在构建方法之前加载它。我在我的应用程序的根目录中有一个带有自定义类的提供程序。该类包含一些变量,如输入装饰等,以及一个名为 themeMode 的变量,它存储用户选择的当前主题模式。用户可以选择系统、浅色或深色。我想从磁盘加载它,我有一个方法可以在课堂上做到这一点。我对类中的themeMode 变量有material App 主题模式,我想加载它。
  • 那么从桌面加载时屏幕上会显示什么?
  • 嗯不确定,可能是黑屏或加载屏幕?猜猜我可以在那里初始化代码。感谢您的帮助!
猜你喜欢
  • 2020-03-20
  • 2018-01-12
  • 2022-01-25
  • 2022-11-24
  • 2013-04-01
  • 1970-01-01
  • 2019-07-07
  • 2020-07-28
  • 1970-01-01
相关资源
最近更新 更多