颤抖:期货和共同的偏好

时间:2018-09-03 08:48:04

标签: asynchronous dart flutter future

我有一个名为“ 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";
    }
    }

我将“ retrieveDB”放在initState()中(在super.initState()之后)。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

改为使用匿名函数

col