Flutter - проблемная комбинация SchedulerBinding, showDialoag, AlertDialog и WillPopScope - PullRequest
1 голос
/ 18 июня 2020

У меня есть AlertDialog, который появляется сразу при переходе go на новый экран. На нем есть НАЗАД и кнопка GO. Мне нужно оставаться на этом экране, когда я закрываю AlertDialog, только если пользователь нажимает GO. Если пользователь нажимает кнопку НАЗАД или кнопку НАЗАД Android, мне нужно go к предыдущему экрану и не оставаться на текущем экране. Когда я закрываю AlertDialog, я использую Navigator.pop (context, false) в случае OK и Navigator.pop (context, true) в случае BACK, используя возвращаемый тип bool для второго Navigator.pop (context), если это верно для перехода на предыдущий экран.

  @override
  void initState() {
    super.initState();
    SchedulerBinding.instance.addPostFrameCallback(
      (_) => _showDialog().then((isScreenToPop) {
     //ERROR: Unhandled Exception: Failed assertion: boolean expression must not be null
        if (isScreenToPop) {
          Navigator.pop(context);
        } else {
          setState(() {});
        }
      }),
    );
  }

Теперь мне нужно обнаружить нажатие на кнопку НАЗАД Android. Для этого я использую WillPopScope с Future.value (true), но это возвращает значение null и оценку для использования второго Navigator.pop (context), возвращающего Unhandled Exception: Failed assertion: логическое выражение не должно быть нулевым.

  Future<bool> _showADialog() {
    return showDialog(
      context: context,
      barrierDismissible: false,
      builder: (_) {
        return WillPopScope(
          onWillPop: () async {
            //THIS RETURN NULL AND NOT Future<true>
            return Future.value(true);
          },
          child: StatefulBuilder(
            builder: (context, setState) {
              return AlertDialog(
                actions: <Widget>[
                  FlatButton(
                    child: Text('BACK'),
                    onPressed: () {
                      Navigator.pop<bool>(context, true);
                    },
                  ),
                  FlatButton(
                    child: Text('OK'),
                    onPressed: () {
                      Navigator.pop<bool>(context, false);
                    },
                  ),
                ],
              );
            },
          ),
        );
      },
    );
  }

Временное решение на данный момент приведено ниже, но мне оно не нравится.

        if (isScreenToPop == null || isScreenToPop) {
          Navigator.pop(context);
        } else {
          setState(() {});
        }

1 Ответ

0 голосов
/ 18 июня 2020

просто возвращает true, а не Future.value(true). Когда вы используете async, возвращаемое значение будет автоматически возвращено как Future.

Кроме того, если вам нужно pop несколько раз, взгляните на другие функции pop, такие как popUntil.

...