Вызов асинхронной функции внутри конструктора - PullRequest
1 голос
/ 15 апреля 2020

У меня есть виджет, где атрибут получается через запрос к базе данных. Так что эта функция должна быть помечена как асинхронная, но я не могу вызвать ее внутри конструктора. Кто-нибудь знает, как это решить?

class PositionWidget extends StatefulWidget {
   final String streetName;
   String date;
   List<Map> notification;
   final VoidCallback onDelete;

  PositionWidget({Key key, this.streetName, this.date,this.notification, @required this.onDelete}): super(key: key){
    this.notification = await DBHelper.instance.getNotification(this.streetName);
  }
}


Future<List<Map>> getNotification(String street) async {
    Database db = await DBHelper.instance.database;
    var res = await db.query(table, columns: [columnNot], where: '${DBHelper.columnName} = ?', whereArgs: [street]);
    return res;
}

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020
initState() {
 myAsyncInit();
}

myAsyncInit() async {
 //do async stuff
}
2 голосов
/ 15 апреля 2020

Вы не можете иметь конструктор async. Используйте FutureBuilder, вероятно, лучшее решение.

Кроме того, вы можете подождать, пока результат будет выглядеть следующим образом:

 PositionWidget({Key key, this.streetName, this.date,this.notification, @required this.onDelete}): super(key: key){
    DBHelper.instance.getNotification(this.streetName)
      .then((result){
         notification = result;
      });
  }
1 голос
/ 15 апреля 2020

Вы не можете сделать это внутри конструктора вашего StatefulWidget

Вы должны сделать свой вызов внутри initState() метода PositionWidgetState (State вашего PositionWidget

class PositionWidgetState extends State<PositionWidget> {
  var res;

  @override
  void initState() {
    res = getNotification(widget.streetName);
  }

Вам, вероятно, понадобится FutureBuilder или StreamBuilder, чтобы иметь дело с результатом

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