#android #flutter #dart #async-await #sqflite
#Android #flutter #dart #async-ожидание #sqflite
Вопрос:
У меня есть функция, которая получает объект из базы данных SQFlite с идентификатором ,
var unit = await getUnitById(1);
Функция выглядит следующим образом
Units getUnitById(int svrId) {
db.initializeDatabase();
Future<Units> unit = db.getUnitsBySvrId(1);
unit.then((value) {
print(value);
});
}
и функция в database helper (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 resu<
}
Мне нужно получить объект Units и использовать его, но когда я вызываю функцию, она ожидает и выполняет приведенный ниже код, а unit равен null, поэтому моя задача не выполнена. мне нужно подождать, пока я не получу данные из базы данных.
Как я могу этого добиться??
Я так запутался в использовании этого async / await.
Ответ №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;
}
Комментарии:
1. Это слишком сложно из-за введения отдельного завершителя. Как показывают другие ответы, достаточно использовать await и возвращать завершенное значение.
Ответ №2:
попробуйте
Units getUnitById(int svrId) async {
db.initializeDatabase();
var unit =await db.getUnitsBySvrId(1);
return unit;
}
Я надеюсь, что это решит вашу проблему
Комментарии:
1. Выдает ли это какую-либо ошибку? Будущая функция должна использовать ‘asyc’, и вы можете дождаться результата от другой функции и вернуть обычный объект
2. Я думаю, что возвращаемый тип должен быть
Future<Units>
.