我有一个像这样的扩展小部件列:

 return new Container(
      child: new Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          new Expanded(
            flex: 1,
            child: convertFrom,
          ),
          new Expanded(
            flex: 1,
            child: convertTo,
          ),
          new Expanded(
            flex: 1,
            child: description,
          ),
        ],
      ),
    );

它是这样的:

convertFrom,包括一个TextField。当我点击这个文本框时,Android键盘就会出现在屏幕上。这会改变屏幕大小,所以小部件会像这样调整大小:

有没有办法让键盘“覆盖”屏幕,使我的列不调整大小?如果我不使用Expanded widgets,并为每个widget硬编码一个高度,这些widget就不会调整大小,但是当键盘出现时,我会得到一个黑黄条纹错误(因为没有足够的空间)。这也不是对所有屏幕尺寸都灵活。

我不确定这是android特有的还是flutter特有的。


当前回答

对我来说,下面的项目属性从真变为假

<item name="android:windowFullscreen">false</item>

在文件

android/app/src/main/res/values/styles.xml

已使Flutter在输入焦点上向上拖动所有页面内容

其他回答

更新后的答案

resizeToAvoidBottomPadding现在已弃用。

更新后的解决方案是将resizeToAvoidBottomInset属性设置为false。


原来的答案

在你的Scaffold中,设置resizeToAvoidBottomPadding属性为false。

根据用例,您还可以考虑使用列表视图。这将确保当没有足够的空间时,内容会滚动。作为一个例子,你可以在图库应用程序中查看文本框演示

我的建议是使用resizeToAvoidBottomInset: false来防止小部件在键盘突然出现在屏幕上时调整大小。例如,如果用户在你的应用中使用Facebook聊天头。

为了防止键盘覆盖小部件,在你需要它的屏幕上,我建议以下方法,其中SingleChildScrollView的高度减少到可用空间的高度。在本例中,SingleChildScrollView也滚动到聚焦的小部件。

final double screenHeight = MediaQuery.of(context).size.height;
final double keyboardHeight = MediaQuery.of(context).viewInsets.bottom;
return Scaffold(
  resizeToAvoidBottomInset: false,
  body: SizedBox(
    height: screenHeight - keyboardHeight,
    child: SingleChildScrollView(
      child: Column(
        children: [
          const SizedBox(height: 200),
          for (var i = 0; i < 10; i++) const TextField()
        ],
      ),
    ),
  ),
);

我的方法是使用SingleChildScrollView与ClampingScrollPhysics物理。

SingleChildScrollView(
  physics: ClampingScrollPhysics(),
  child: Container(),
)

你可以使用

Scaffold(
  resizeToAvoidBottomInset: false, 
  ... 
)

或者可以将小部件打包

SingleChildScrollView