dart – 显示文本字段对话框而不被键盘覆盖?
发布时间:2020-12-14 14:55:57 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个允许用户输入其名称的SimpleDialog.但是当它显示时,对话框被屏幕键盘隐藏了一半: 如何让Dialog完全可见? 编辑:我觉得奇怪的是,主页小部件(FocusVisibilityDemo)识别出降低的高度,因此调整“推送我”按钮的位置以保持在中心.不幸的是,对
我正在尝试创建一个允许用户输入其名称的SimpleDialog.但是当它显示时,对话框被屏幕键盘隐藏了一半:
如何让Dialog完全可见? 编辑:我觉得奇怪的是,主页小部件(FocusVisibilityDemo)识别出降低的高度,因此调整“推送我”按钮的位置以保持在中心.不幸的是,对话框的行为方式不同. 这是我的代码: import 'package:flutter/material.dart'; class FocusVisibilityDemo extends StatefulWidget { @override _FocusVisibilityDemoState createState() => new _FocusVisibilityDemoState(); } class _FocusVisibilityDemoState extends State<FocusVisibilityDemo> { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text('Text Dialog Demo')),body: new Center( child: new RaisedButton( onPressed: _showDialog,child: new Text("Push Me"),),); } _showDialog() async { await showDialog<String>( context: context,child: new AlertDialog( contentPadding: const EdgeInsets.all(16.0),content: new Row( children: <Widget>[ new Expanded( child: new TextField( autofocus: true,decoration: new InputDecoration( labelText: 'Full Name',hintText: 'eg. John Smith'),) ],actions: <Widget>[ new FlatButton( child: const Text('CANCEL'),onPressed: () { Navigator.pop(context); }),new FlatButton( child: const Text('OPEN'),onPressed: () { Navigator.pop(context); }) ],); } } void main() { runApp(new MaterialApp(home: new FocusVisibilityDemo())); } 解决方法
如果您的用例是在Dialog中添加多个TextField,这样您的主表单就不会变得拥挤,我认为如果你构建一些比AlertDialog和SimpleDialog更可定制的东西会更好,因为它们用于简单的活动(确认,无线电……等等) ).
否则,为什么要对单个TextField使用Dialog? 当我们添加多个TextField时,我们应该注意我们的设计选择,因为其他人将与此视图交互以填充数据,在这种情况下,我更喜欢使用 这是一个关于如何使用FullScreenDialog的快速示例,我希望这个帮助你应该能够以你想要的方式修改它: import 'package:flutter/material.dart'; void main() { runApp(new MaterialApp(home: new MyApp(),)); } class MyApp extends StatefulWidget { @override MyAppState createState() => new MyAppState(); } class MyAppState extends State<MyApp> { FullScreenDialog _myDialog = new FullScreenDialog(); @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("Fill this form"),body: new Column( children: <Widget>[ new TextField(controller: new TextEditingController( text: "Add a single text field"),new Card(child: new ListTile( title: new Text("Click to add your top 3 amazing skills"),subtitle: new Text( "${_myDialog._skillOne} ${_myDialog._skillTwo} ${_myDialog ._skillThree}"),onTap: () { Navigator.push(context,new MaterialPageRoute( builder: (BuildContext context) => _myDialog,fullscreenDialog: true,)); },],) ); } } class FullScreenDialog extends StatefulWidget { String _skillOne = "You have"; String _skillTwo = "not Added"; String _skillThree = "any skills yet"; @override FullScreenDialogState createState() => new FullScreenDialogState(); } class FullScreenDialogState extends State<FullScreenDialog> { TextEditingController _skillOneController = new TextEditingController(); TextEditingController _skillTwoController = new TextEditingController(); TextEditingController _skillThreeController = new TextEditingController(); @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text("Add your top 3 skills"),body: new Padding(child: new ListView( children: <Widget>[ new TextField(controller: _skillOneController,new TextField(controller: _skillTwoController,new TextField(controller: _skillThreeController,new Row( children: <Widget>[ new Expanded(child: new RaisedButton(onPressed: () { widget._skillThree = _skillThreeController.text; widget._skillTwo = _skillTwoController.text; widget._skillOne = _skillOneController.text; Navigator.pop(context); },child: new Text("Save"),)) ],padding: const EdgeInsets.symmetric(horizontal: 20.0),) ); } } 编辑 在做了一些研究后,看来this is a bug在当前的Flutter版本中,临时修复也记录在这个问题上. import 'package:flutter/material.dart'; void main() { runApp(new MaterialApp(home: new FocusVisibilityDemo())); } class FocusVisibilityDemo extends StatefulWidget { @override _FocusVisibilityDemoState createState() => new _FocusVisibilityDemoState(); } class _FocusVisibilityDemoState extends State<FocusVisibilityDemo> { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar(title: new Text('Text Dialog Demo')),child: new _SystemPadding(child: new AlertDialog( contentPadding: const EdgeInsets.all(16.0),); } } class _SystemPadding extends StatelessWidget { final Widget child; _SystemPadding({Key key,this.child}) : super(key: key); @override Widget build(BuildContext context) { var mediaQuery = MediaQuery.of(context); return new AnimatedContainer( padding: mediaQuery.viewInsets,duration: const Duration(milliseconds: 300),child: child); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |