Как дождаться, пока функция вернет значение flutter

#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> .