Ожидание не принято, пока функция определена как асинхронная - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть сообщение об ошибке асинхронной функции. Я использую await, и моя функция четко определена как асинхронная. Чтобы быть более точным c, ошибка относится к последней строке моего кода (когда я вызываю функцию getObjects ()).

Мой код в основном основан на документации, поэтому я довольно удивлен перед лицом ошибки.

Сообщение об ошибке:

{
    "resource": "/Users/MyName/Documents/Development/thesafe1/lib/main.dart",
    "owner": "dart",
    "code": "await_in_wrong_context",
    "severity": 8,
    "message": "The await expression can only be used in an async function.\nTry marking the function body with either 'async' or 'async*'.",
    "source": "dart",
    "startLineNumber": 52,
    "startColumn": 31,
    "endLineNumber": 52,
    "endColumn": 36,
    "tags": []
}

Мой код:

//Open database
final Future<Database> database = getDatabasesPath().then((String path) {
  return openDatabase(join(path, 'database.db'), onCreate: (db, version) {
    return db.execute(
        //"CREATE TABLE objects(uuid TEXT PRIMARY KEY, objectName TEXT, price REAL, category TEXT"
        "CREATE TABLE objects(uuid TEXT PRIMARY KEY, objectName TEXT)"
      );
  }, version: 1);
});

//Functions to access the database of objects : insert, get
//Function to insert object in the database
Future<void> insertObject(MyObject object) async {
  final Database db = await database;

  await db.insert('objects', object.toMap(),
      conflictAlgorithm: ConflictAlgorithm.replace);
}

Future<List<MyObject>> getObjects() async {
  final Database db = await database;

  final List<Map<String, dynamic>> maps = await db.query('objects');

  return List.generate(maps.length, (i){
    return MyObject(
      uuid: maps[i]['uuid'],
      objectName: maps[i]['objectName']
    );
  });
}

List<MyObject> myObjectList = await getObjects(); 

Спасибо

1 Ответ

0 голосов
/ 21 апреля 2020

Вы можете использовать все методы, как описано ниже:

  1. Вы должны написать все методы внутри класса singleton. (Я взял FireBaseModel )
  2. Вы можете использовать эту функцию в StateFul Виджет, как показано ниже.

        @override void initState() {   
        super.initState(); 
        var allObjects = FireBaseModel.instance. getObjects();
        if (allObjects != null) {
          setState(() {
            refreshUI();
          });
        }
      }
    

Как создать одноэлементный экземпляр:

class FireBaseModel  {
  FireBaseModel._privateConstructor() {
    debugPrint('constructor');
  }

  static final FireBaseModel _instance =
      FireBaseModel._privateConstructor();

  // Singleton object
  static FireBaseModel get instance {
    return _instance;
  }

   //
   .
   .
   .
   Add all your methods here

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...