android - Flutter-SchedulerBinding,showDialoag,AlertDialog和WillPopScope的问题组合

标签 android ios flutter dart

我有一个AlertDialog,当转到新屏幕时会立即出现。它具有BACK和GO按钮。仅在用户按GO时关闭AlertDialog时,我需要保留在此屏幕中。如果用户按BACK按钮或BACK Android Button,则需要转到上一个屏幕,而不要保留在当前屏幕中。
当我关闭AlertDialog时,如果可以,则使用Navigator.pop(context,false),如果使用BACK,则使用boolean返回类型,如果使用BACK,则使用boo。返回返回上一个屏幕。

  @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:失败的断言: bool(boolean) 表达式不能为null。
  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(() {});
        }

最佳答案

只返回true而不是Future.value(true)。当您使用async时,返回值将自 Action 为Future返回。

另外,如果您需要多次使用pop,请查看其他pop函数,例如popUntil

关于android - Flutter-SchedulerBinding,showDialoag,AlertDialog和WillPopScope的问题组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62438720/

相关文章:

ios - xcode - Swift - 如何获得动态表格 View 以便每个单元格在被选中时可以展开并显示更多信息

ios - AWS S3 iOS 开发工具包 : How to resume upload after connection is interrupted?

javascript - 如何自动大写 phonegap for Android 中的文本输入?

Android - 如果我暂停、清除缓存并恢复,我的应用程序会崩溃

ios - 替换了viewController

dart - 键盘打开时 Flutter 出现溢出错误

flutter - 如何从Flutter中的API获取字符串值?

Flutter SlideTransition 以 Offset OFF SCREEN 开始

android - 新手 - 按钮的Android编码问题

android - 使用 Glide 缩放和蒙版