【问题标题】:Waiting till function is completed (Flutter) [duplicate]等待功能完成(颤振)[重复]
【发布时间】:2022-01-26 15:05:02
【问题描述】:

我的代码有问题:我的目标是从 sharedprefs 中获取数据,然后使用存储的数据。问题是我从 sharedprefs 获取数据的函数太慢了,或者换句话说,我调用获取数据的函数的函数太快了。

流程应该是:在main.dart我调用了一个函数getDataString(),在sharedPreferences.dart文件中,-->函数getDataString()应该从sharedprefs中获取数据-->数据应该打印出来。

使用我的代码,我得到的结果为 null,但是当我第二次打印变量 savedData 时,我得到了我正在寻找的结果。所以我认为 getDataString 函数太慢了。怎么才能等到函数完成?

这是我试过的代码:

这是来自sharedPreferences.dart 文件的getDataString() 函数:

Future<String> getDataString() async {
  final prefs = await SharedPreferences.getInstance();
  savedData = jsonDecode(prefs.getString("savedData"));
}

这是来自main.dartinitState

  void initState() {
    super.initState();
    getData();
    log(savedData.toString());
    });
  }

【问题讨论】:

  • GetDataString 返回一个未来,要么你需要等待,要么使用然后阻塞
  • 我该怎么做?抱歉,我对扑腾还很陌生……
  • 使用 then:getDataString().then( (savedData) =&gt; log(savedData.toString());)
  • 可以查看this
  • @MidhunMP 当我尝试你推荐的代码时,我仍然得到 null 作为结果

标签: flutter dart asynchronous async-await sharedpreferences


【解决方案1】:

如果您只想记录数据,您可以将日志调用移至getData() 的末尾。如果要使用数据,可以使用.thenawait。例如:

getData().then((data) => log(savedData.toString())

您的方法getData 返回一个Future。这就像一个承诺,在未来的某个时候它会返回一个字符串。它不是返回字符串,只是一个引用,您可以在将来使用它来获取字符串。

我无权访问您的其他课程,但我怀疑应该在其他地方调用 getData(),并且您应该首先显示等待小部件,而不是 initState()

这有点复杂,但您可以使用 FutureBuilder 来完成。你可以找到a good example here

【讨论】:

  • 我不赞成这个答案,因为你应该永远从 build 方法执行任何昂贵的调用,永远。我建议在这里使用FutureBuilder
  • 我同意日文的观点。我删除了对 build() 的引用。它可能会减慢渲染速度。 FutureBuilder 可能是最好的解决方案。
【解决方案2】:

不要试图在 initState() 中获取未来的数据。而是在小部件构建中尝试 Future builder 并在 future 属性中调用 getData 或 getDataString 方法,返回值为 String。

【讨论】:

    猜你喜欢
    • 2020-09-25
    • 2021-03-28
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2021-06-02
    • 2021-05-05
    • 2020-10-25
    • 2021-01-06
    相关资源
    最近更新 更多