在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!'),
)
],
);
});
}
}
答案 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
我想这是针对框架未提供的功能的创造性解决方案的副作用的练习,同时还要了解更新框架的影响。