当键盘挡住它时如何将textField带入视野?

Posted

技术标签:

【中文标题】当键盘挡住它时如何将textField带入视野?【英文标题】:How to bring textField into view when keyboard obstructs it? 【发布时间】:2019-10-21 22:15:34 【问题描述】:

我知道这是一个常见问题,但我找不到解决问题的确切方法。我在底部创建了一个包含 TextField 的小部件的 Column 视图,当键盘弹出时,textField 被隐藏。

最初,视图溢出,因此,我设置了 resizeToAvoidBottomPadding: false 来解决该问题。 但是,现在文本字段被完全隐藏了。

我在代码中使用了 Spacer 和 flex,因此不想切换到 ListView。

我该如何解决这个问题?

【问题讨论】:

请显示一些您尝试过的代码。 【参考方案1】:

您的主要问题归结为想要在需要位于 ScrollView 中的 Column 中使用 Flex。您希望您的列在键盘未显示时填满整个页面,在显示键盘时根据需要删除尽可能多的空白空间,如果在删除所有空白空间后它仍然不适合剩余屏幕,则变为可滚动.

为此,您需要使用此页面中的最后一个示例:https://api.flutter.dev/flutter/widgets/SingleChildScrollView-class.html

Widget build(BuildContext context) 
  return LayoutBuilder(
    builder: (BuildContext context, BoxConstraints viewportConstraints) 
      return SingleChildScrollView(
        child: ConstrainedBox(
          constraints: BoxConstraints(
            minHeight: viewportConstraints.maxHeight,
          ),
          child: IntrinsicHeight(
            child: Column(
              children: <Widget>[
                Container(
                  // A fixed-height child.
                  color: const Color(0xff808000), // Yellow
                  height: 120.0,
                ),
                Expanded(
                  // A flexible child that will grow to fit the viewport but
                  // still be at least as big as necessary to fit its contents.
                  child: Container(
                    color: const Color(0xff800000), // Red
                    height: 120.0,
                  ),
                ),
              ],
            ),
          ),
        ),
      );
    ,
  );

您需要 LayoutBuilder,因为它提供了 viewportConstraints,它为您提供了孩子可以使用而不会溢出的最大高度。当键盘显示/隐藏时,它也会自动重建,因为这个值会改变。

您需要 SingleChildScrollView 能够在 Column 不再适合屏幕时滚动。

您需要 IntrinsicHeight 以便 Column 采用与其内容所需的高度完全相同的高度。没有这个,Column 会因为 ScrollView 占用无限高,Spacers 会抛出异常。

您需要 ConstrainedBox 来设置 Column 必须使用的最小高度 - 这是上面提到的值,来自 LayoutBuilder。这会强制 Column 至少与屏幕允许的一样大 - 如果没有这个,您的 Spacers 将不起作用,因为由于 InstrinsicHeight 小部件,Column 将缩小到其最小高度。

这可能有点难以理解,因为实现此布局需要大量用于不同目的的小部件,但好消息是您只需复制粘贴它并更改 Column 的内容。

【讨论】:

【参考方案2】:

您可以使用 SingleChildScrollView 来包装您的小部件。例如:

                SingleChildScrollView(
                    child: new Column(
                      children: <Widget>[
                        drawerIcon(),
                        buttonForSomething,
                        fillerRow(5),
                        checkBoxForSomething(),
                        checkBoxForSomeOtherThing(),
                        ...

                      ],
                  ),
                )

另外:看看link 是否有帮助。

【讨论】:

这会再次导致渲染错误,因为在 Column 中使用了 Spacer Widgets! 它可能不会。我刚刚使用虚拟 Flutter 应用程序进行了测试,添加了一些随机组件,包括 specer (flex)。底部有一个文本字段。弹出键盘后,我看到像素溢出。然后,我将它们包裹在 SingleChildScrollView 中,休息成功。

以上是关于当键盘挡住它时如何将textField带入视野?的主要内容,如果未能解决你的问题,请参考以下文章

swift 点击Textfield 后自动上移,避免键盘被遮住

当焦点在 TextField 上并且在 Flutter 中打开键盘时,如何向上推送内容?

当虚拟键盘覆盖它时,如何让您的页面将输入元素滚动到视图中?

用户点击字段时如何将 textFieldStyle 切换为 TextField?

键盘出现时UITextField上移【Swift】

为啥Android不会暂停视图完全被软键盘挡住的片段?