【问题标题】:How to wait till function returns value flutter如何等到函数返回值颤动
【发布时间】:2025-12-06 05:50:02
【问题描述】:

我有一个函数可以从 SQFlite db 获取带有 id 的对象,

    var unit =  await getUnitById(1);

函数长这样

Units getUnitById(int svrId) {
  db.initializeDatabase();
  Future<Units> unit = db.getUnitsBySvrId(1);
  unit.then((value) {
    print(value);
  });  
}

数据库助手(db)中的函数如下所示:

Future<Units> getUnitsBySvrId(int svrId) async {
if (svrId != null) {
  var unitsMapList = await getUnitMapListById(svrId);
  return Units.fromMapObject(unitsMapList[0]);
} else
  return null;
}

查询执行如下所示:

Future<List<Map<String, dynamic>>> getUnitMapListById(int id) async {
  Database db = await this.database;
  // var result = await db.rawQuery('SELECT * FROM $DOG_TABLE order by $ID ASC');
  var result =
    await db.rawQuery('SELECT * FROM $UNIT_TABLE WHERE $SERVER_ID = $id');
  return result;
}

我需要获取 Units 对象并使用它,但是当我调用该函数时,它会等待并执行下面的代码,并且 unit 为空,因此我的任务失败了。我需要等到我从数据库中获取数据。

我怎样才能做到这一点??
我对使用这个 async/await 感到很困惑。

【问题讨论】:

    标签: android flutter dart async-await sqflite


    【解决方案1】:

    你可以这样包装整个代码,

    Future<Units> getUnitById(int svrId) async {
        Completer<Units> completer = Completer();
    
        // If this line return future,like just below, we have to wait it too
        // await db.initializeDatabase(); 
        db.initializeDatabase();
    
        Units units = await db.getUnitsBySvrId(svrId);
    
        completer.complete(units);
    
        return completer.future;
    }
    

    然后调用

    var svrId = 1;
    var units = await getUnitById(svrId);
    

    这个方法可以不用Completer

    Future<Units> getUnitById(int svrId) async {
        // If this line return future,like just below, we have to wait it too
        // await db.initializeDatabase(); 
        db.initializeDatabase();
    
        Units units = await db.getUnitsBySvrId(svrId);
    
        return units;
    }
    

    【讨论】:

    • 通过引入单独的完成器,这过于复杂。正如其他答案所示,使用 await 并返回完成的值就足够了。
    【解决方案2】:

    试试

    Units getUnitById(int svrId) async {
    db.initializeDatabase();
    var unit =await db.getUnitsBySvrId(1);
    return unit;
    }
    

    希望能解决你的问题

    【讨论】:

    • 它会抛出任何错误吗?未来函数需要使用'asyc',你可以等待其他函数的结果并返回一个正常的对象
    • 我认为返回类型需要是Future&lt;Units&gt;