为什么这个函数不返回String?而不是未来<String?>

问题描述 投票:0回答:1

我对编程相对较新,我真的不明白为什么这种情况不断发生,未来函数的全部意义不就是等待我们收到所需类型的数据吗?

class CardsDataBase extends ChangeNotifier {
  String folderBoxName = 'default';
  CardsDataBase(){
    folderBoxName = getBoxName();
  }
  Future<String?> getBoxName() async{
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    String? boxReferenceKey = prefs.getString(AppConstants.kBoxPreferenceKey);
    return boxReferenceKey;
  }
//Other stuff
}

我尝试将

await
放在
getBoxName
之前,但它不允许我这样做,因为它是构造函数。

另外,有没有更好的方法来添加此功能? 我试图做到这一点,一旦用户使用他们的帐户登录,就会打开一个包含该用户 ID 的配置单元框。因此,当他们注销并使用不同的帐户重新登录时,他们将拥有该新帐户的本地数据。

flutter dart async-await future
1个回答
0
投票

从共享首选项中获取值是一个异步操作,因为它可能需要一些时间才能完成。没有办法将异步操作变成同步操作。而且也无法在构造函数中使用

await
(正如 Randal 评论的那样)。

解决办法是:

  • 将共享首选项存储在应用程序的状态中,例如在
    StatefulWidget
  • 在小部件的构造函数中指定初始值。
  • 在您的 UI 中渲染该初始值,例如通过显示
    CircularProgressIndicator
  • 从共享首选项中获取状态值时更新该值,例如通过 致电
    setState
  • 这会触发另一个渲染,因此现在您可以渲染该值而不是进度指示器。

Flutter 文档和第 3 方教程中对此进行了相当广泛的介绍,因此我建议检查上面包含的链接:

© www.soinside.com 2019 - 2024. All rights reserved.