颤振:期货和共享偏好

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

我有一个名为'retrieveDB'的函数,它使用shared_preferences.dart插件来检索我将用于决定是否从Firestore检索哪个集合/文档名称的数据。我在类的顶部初始化了usersDB和notifDoc =“”。

    Future retrieveDB() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String db = prefs.getString('db');

    if (db == "MISS") {
      usersDB = "users_miss";
      notifDoc = "notifTokenMISS";
    } else if (db == "SDD") {
      usersDB = "users";
      notifDoc = "notifToken";
    }
    }

我在initState()中放置了'retrieveDB'第一件事(在super.initState()之后)。

我的问题(我认为)是shared_preferences使用Future并且它暂停其执行并继续执行从Firestore检索数据的其他函数,使文档名称(usersDB和notifDoc =“”)为空,从而产生错误。有没有办法在继续执行其他功能之前先等待'retrieveDB',或者是否有任何地方可以将'retrieveDB'放在首先执行/完成?或者是否有更好的逻辑来实现我想要的东西?

asynchronous dart flutter future
2个回答
1
投票

异步是具有传染性的。您无法从异步返回到同步。如果函数使用async,则在调用它时需要使用await以确保仅在异步函数完成后才执行以下代码:

Future foo() async {
  await retrieveDB();
  // other code that depends on the result or side effects of retrieveDB()
}

0
投票

请改用匿名函数

@override
      void initState() {
        super.initState();
    () async {
    await retrieveDB();
    }
    }
© www.soinside.com 2019 - 2024. All rights reserved.