Ошибки в AlertDialog

Я следую за https://codingwithjoe.com/flutter-navigation-how-to-prevent-navigation/ для шоу AlertDialog, но у меня есть две ошибки:

  1. При нажатии вне диалогового окна (отменить барьер без нажатия какой-либо кнопки) появляется ошибка времени выполнения:
  Dart Error: Unhandled exception:Failed assertion: boolean expression must not be null

2. child: новый AlertDialog("child устарел и не должен использоваться").

Код:

Future<bool> _exitApp(BuildContext context) {
  return showDialog(
        context: context,
        child: new AlertDialog(
          title: new Text('Do you want to exit this application?'),
          content: new Text('We hate to see you leave...'),
          actions: <Widget>[
            new FlatButton(
              onPressed: () => Navigator.of(context).pop(false),
              child: new Text('No'),
            ),
            new FlatButton(
              onPressed: () => Navigator.of(context).pop(true),
              child: new Text('Yes'),
            ),
          ],
        ),
      ) ??
      false;
}

Трассировки стека:

#0      ModalRoute.willPop (package:flutter/src/widgets/routes.dart)
<asynchronous suspension>
#1      NavigatorState.maybePop (package:flutter/src/widgets/navigator.dart:1783:57)
<asynchronous suspension>
#2      Navigator.maybePop (package:flutter/src/widgets/navigator.dart:1133:34)
#3      BackButton.build.<anonymous closure> (package:flutter/src/material/back_button.dart:91:19)
#4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)
#5      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)
#6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
#7      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
#8      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:204:7)
#9      GestureArenaManager.sweep (package:flutter/src/g<…>

Спасибо!

1 ответ

Сделай свой метод async и использовать await ключевое слово:

Future<bool> _exitApp(BuildContext context) async {
  return await showDialog(  ...

Если вы не хотите закрывать диалог, когда вы нажимаете за пределы контейнера, установите barrierDismissible ложно.

showDialog(barrierDismissible: false, ...
Другие вопросы по тегам