Keyboard 当键盘出现时,颤振小部件将调整大小。如何预防?

Keyboard 当键盘出现时,颤振小部件将调整大小。如何预防?,keyboard,resize,widget,textfield,flutter,Keyboard,Resize,Widget,Textfield,Flutter,我有一列扩展的小部件,如下所示: return new Container( child: new Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ new Expanded( flex: 1, child: convertFrom, ),

我有一列扩展的小部件,如下所示:

 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,
          ),
        ],
      ),
    );
返回新容器(
子:新列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
新扩展(
弹性:1,
孩子:从,
),
新扩展(
弹性:1,
孩子:转换成,
),
新扩展(
弹性:1,
孩子:描述,
),
],
),
);
看起来是这样的:

 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
,包含一个文本字段。当我点击这个文本字段时,屏幕上会出现Android键盘。这会改变屏幕大小,因此小部件的大小如下所示:

 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,
          ),
        ],
      ),
    );

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


我不确定这是安卓特有的还是颤振特有的。

更新的答案

resizetoavidobtompadding
现在已不推荐使用

    return Scaffold(
      resizeToAvoidBottomInset : false,
      body: YourWidgets(),
    );
更新后的解决方案是将
resizetoavidbottominset
属性设置为
false


原始答案


在您的代码>脚手架< /代码>中,设置<代码> RsiZutOutEndoPutoPosip> 属性>代码> false .< /P> < P>根据用例,您也可以考虑使用A。这将确保内容在空间不足时滚动。例如,您可以查看gallery应用程序中的演示

设置为
false
,而不是弃用的

    return Scaffold(
      resizeToAvoidBottomInset : false,
      body: YourWidgets(),
    );

方法1:从AndroidManifest.xml文件中删除android:WindowsOfInputMode=“adjustResize”(否则将覆盖颤振代码),并在脚手架中添加
resizeToAvoidBottomPadding:false
,如下所示:

Scaffold(
      resizeToAvoidBottomPadding: false,
      appBar: AppBar()
)
方法2(不推荐):只需在活动中的android android manifest.xml中添加
android:windowSoftInputMode=“stateVisible”
,它将仅适用于android,而不适用于类似IOS的系统

<activity
       ...
        android:windowSoftInputMode="stateVisible">


注意:不要将其设置为
android:windowSoftInputMode=“adjustResize”
大多数其他答案建议使用
resizetoavidbottompadding=false
。根据我的经验,这允许键盘覆盖文本字段,如果它们位于键盘显示的下方

我目前的解决方案是强制我的列与屏幕高度相同,然后将其放置在
SingleChildScrollView
中,这样当使用键盘时,颤振会自动向上滚动屏幕

Widget build(BuildContext context) {
  return Scaffold(
    body: SingleChildScrollView(
      physics: NeverScrollableScrollPhysics(),
      child: ConstrainedBox(
        constraints: BoxConstraints(
          minWidth: MediaQuery.of(context).size.width,
          minHeight: MediaQuery.of(context).size.height,
        ),
        child: IntrinsicHeight(
          child: Column(
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
              // CONTENT HERE
            ],
          ),
        ),
      ),
    ),
  );
}
小部件构建(构建上下文){
返回脚手架(
正文:SingleChildScrollView(
物理学:NeverscrollableScroll物理学(),
子:约束框(
约束:BoxConstraints(
minWidth:MediaQuery.of(context).size.width,
minHeight:MediaQuery.of(context).size.height,
),
孩子:内在的(
子:列(
mainAxisSize:mainAxisSize.max,
儿童:[
//满足于此
],
),
),
),
),
);
}

我使用了
NeverScrollableScrollPhysics
,这样用户就不能自己滚动了。

我认为如果我们实施@Aman的解决方案,我们的应用程序会像键盘出现时一样难看,它不会根据可用高度调整屏幕的视口,并且会显示出隐藏在键盘后面的其他字段。因此,我建议改用
SingleChildScrollView

SingleChildScrollView
包装代码,如下所示

 return new Container(
  child: SingleChildScrollView(
    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,
      ),
    ],
  ),
 ),
);
返回新容器(
子:SingleChildScrollView(
子:新列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
新扩展(
弹性:1,
孩子:从,
),
新扩展(
弹性:1,
孩子:转换成,
),
新扩展(
弹性:1,
孩子:描述,
),
],
),
),
);

我的方法是将
SingleChildScrollView
ClampingScrollPhysics
physics一起使用

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

对于我来说,将下面的项属性从true更改为false

<item name="android:windowFullscreen">false</item>
使颤振将所有页面内容向上拖动到输入焦点


我的建议是使用
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()
        ],
      ),
    ),
  ),
);
final double screenHeight=MediaQuery.of(context).size.height;
最终双键盘高度=MediaQuery.of(context).viewInsets.bottom;
返回脚手架(
resizeToAvoidBottomInset:false,
正文:SizedBox(
高度:屏幕高度-键盘高度,
子:SingleChildScrollView(
子:列(
儿童:[
const SizedBox(高度:200),
对于(var i=0;i<10;i++)常量TextField()
],
),
),
),
);

我也面临着同样的问题,我开始尝试随机解决方案来解决它,但突然间这个问题解决了。

将主父容器包装在SingleChildScrollView()中,并为其指定设备高度,即device_height=MediaQuery.of(context).size.height


这将使整个页面可滚动,但不会调整任何小部件的大小。

避免调整小部件大小的最佳解决方案