android - 如何等到函数返回值颤动
问题描述
我有一个从 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 感到很困惑。
解决方案
你可以像这样包装整个代码,
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;
}
推荐阅读
- python - 如何设置 pip 默认从镜像仓库下载?
- android - 该应用程序在关闭后仍会自行重启
- python - 角色和背景图像未显示在游戏窗口中
- apache - 通过公司代理从 Apache 发送 SSL 客户端证书到第三方系统
- excel - 如何遍历一列,将每个值与其他两个固定单元格中的值相乘?
- angular - 过滤数组的方法
- python - ModuleNotFoundError:没有名为“tensorflow_federated.python.research”的模块
- python - 如何在邮递员中发送数组并在 OpenApi3.0 中以正确的形式接收
- javascript - 无法从 React 前端获取 express API
- python - 如何使文本出现在圆圈中