Как я могу использовать showDialog с await - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть три примера showDialog.Я предполагаю, что _showAlert1 является правильным, однако он использует 2 функции для достижения этой цели._showAlert2 также работает, однако я предполагаю, что это не правильно, потому что я считаю, что showDialog является асинхронным, и я предполагаю, что эта функция зависит от отображения диалогового окна в течение достаточного времени._showAlert3 не работает, потому что диалоговое окно остается на экране и не очищается.

Если _showAlert2 хотя он работает неправильно по вышеуказанной причине, может кто-нибудь показать мне, как это должно быть структурировано, чтобы это можно было сделатьв одной функции.

Примеры:

void _showAlert0(BuildContext context, String text, int seconds) async {
    return await showDialog(
        barrierDismissible: false,
        context: context,
        builder: (context) => AlertDialog(
              title: Text("Error"),
              content: Text(text),
            ));
  }

  void _showAlert1(BuildContext context, String text, int seconds) async {
    _showAlert0(context, text, seconds);
    await Future.delayed(Duration(seconds: seconds));
    Navigator.of(context).pop(true);
  }

  void _showAlert2(BuildContext context, String text, int seconds) async {
    showDialog(
        barrierDismissible: false,
        context: context,
        builder: (context) => AlertDialog(
              title: Text("Error"),
              content: Text(text),
            ));
    await Future.delayed(Duration(seconds: seconds));
    Navigator.of(context).pop(true);
  }

void _showAlert3(BuildContext context, String text, int seconds) async {
    await showDialog(
        barrierDismissible: false,
        context: context,
        builder: (context) => AlertDialog(
              title: Text("Error"),
              content: Text(text),
            ));
    await Future.delayed(Duration(seconds: seconds));
    Navigator.of(context).pop(true);
}

1 Ответ

0 голосов
/ 03 февраля 2019

Не уверен, что есть лучший способ, но, похоже, работает следующее.Обратите внимание на предложение «then» при вызове showDialog ().

void _showAlert3(BuildContext context, String text, int seconds) async {
    showDialog(
        barrierDismissible: false,
        context: context,
        builder: (context) => AlertDialog(
              title: Text("Error"),
              content: Text(text),
            )).then((val) {});
    await Future.delayed(Duration(seconds: seconds));
    Navigator.of(context).pop(true);
  }

Что касается троллей, RTFQ («структурированный так, что это можно сделать в одной функции»), и если вы неЯ не хочу помогать, а потом уходить.

...