flutter-在iOS中忽略showDialog的barrierDismissible吗?

时间:2019-10-29 21:53:11

标签: flutter dart

在android中,当您点击使用showDialog()创建的(材料)模态对话框的“屏障” /外部/背景时,默认情况下该对话框关闭。

当您在iphone(物理设备)上点击该屏障时,将关闭的点击被忽略,并且模式保持打开状态。

我意识到有一个“ showCupertinoDialog”选项,但是我试图避免使用它(它也不会轻按障碍来关闭)。

flutter / dart文档未表明android -vs-ios的预期行为有任何差异。我提供了一些说明问题的示例代码,我希望_showMaterialDialog()对话框在iPhone上关闭,但不会关闭。

知道为什么这行不通吗?这是错误还是预期的行为?谢谢!

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';


class dialogtest extends StatefulWidget {
  @override
  dialogtestState createState() => dialogtestState();
}

class dialogtestState extends State<dialogtest> {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
        child: Scaffold(
            appBar: AppBar(
              title: Text('Dialog Demo'),
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  RaisedButton(
                    onPressed: () {
                      _showMaterialDialog();
                    },
                    child: Text('Show Material Dialog'),
                  ),
                  SizedBox(
                    height: 20,
                  ),
                  RaisedButton(
                    onPressed: () {
                      _showCupertinoDialog();
                    },
                    child: Text('Show Cupertino Dialog'),
                  ),
                ],
              ),
            )));
  }

  void _showMaterialDialog() {
    showDialog(
        context: context,
        barrierDismissible: true, // ********* ignored in ios, defaults to true anyway!!
        builder: (context) {
          return AlertDialog(
            title: Text('Material Dialog'),
            content: Text('This is the content of the material dialog'),
            actions: <Widget>[
              FlatButton(
                  onPressed: () {
                    _dismissDialog();
                  },
                  child: Text('Close')),
              FlatButton(
                onPressed: () {
                  print('HelloWorld!');
                  _dismissDialog();
                },
                child: Text('HelloWorld!'),
              )
            ],
          );
        });
  }

  _dismissDialog() {
    Navigator.pop(context);
  }

  void _showCupertinoDialog() {
    showDialog(
        context: context,
        builder: (context) {
          return CupertinoAlertDialog(
            title: Text('Cupertino Dialog'),
            content: Text('This is the content of the cupertino dialog'),
            actions: <Widget>[
              FlatButton(
                  onPressed: () {
                    _dismissDialog();
                  },
                  child: Text('Close')),
              FlatButton(
                onPressed: () {
                  print('HelloWorld!');
                  _dismissDialog();
                },
                child: Text('HelloWorld!'),
              )
            ],
          );
        });
  }

}

1 个答案:

答案 0 :(得分:0)

我想出了办法,以防任何人随机遇到这种行为。

当我创建项目时,我使用的是flutter 1.7(仅适用于android)。为了在点击文本框时支持文本框的“非聚焦”,我将整个项目包装在GestureDetector中,并附有以下说明:

https://flutter360.dev/dismiss-keyboard-form-lose-focus

一切正常。当我将应用程序移至Mac进行iOS测试时,我安装了v1.9.1 + hotfix.6随附的新版flutter。我猜是从1.7-> 1.9.1发生了变化,这打破了这种不受支持的实现。我没有考虑我的Windows / Android Flutter版本(在该版本中起作用)与我的Mac / ios版本(在该版本中不起作用)之间的区别,我认为这是iOS的事情。将PC上的Flutter升级到1.9.1之后,对话框将不再在Android手机上关闭。

我仍然需要/想要从文本字段中轻按以关闭键盘的方法。我正在从这里尝试使用Listener解决方案,到目前为止,该解决方案似乎可以按预期运行:

Flutter. A way for TextField to detect tap outside

我想这是针对框架未提供的功能的创造性解决方案的副作用的练习,同时还要了解更新框架的影响。