加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

dart – 显示文本字段对话框而不被键盘覆盖?

发布时间:2020-12-14 14:55:57 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个允许用户输入其名称的SimpleDialog.但是当它显示时,对话框被屏幕键盘隐藏了一半: 如何让Dialog完全可见? 编辑:我觉得奇怪的是,主页小部件(FocusVisibilityDemo)识别出降低的高度,因此调整“推送我”按钮的位置以保持在中心.不幸的是,对
我正在尝试创建一个允许用户输入其名称的SimpleDialog.但是当它显示时,对话框被屏幕键盘隐藏了一半:

Screenshot

如何让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时,我们应该注意我们的设计选择,因为其他人将与此视图交互以填充数据,在这种情况下,我更喜欢使用PageRoute类的fullscreenDialog属性.我不确定SimpleDialog是否适合Flutter中的那个.

这是一个关于如何使用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版本中,临时修复也记录在这个问题上.

enter image description here

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);
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读