首先来看下面例子,项目中需要实现如图功能,解析一下需求:
- 【确定】按钮需要放在页面底部
- 页面需要包裹在
SingleChildScrollView
中,当键盘出现时,系统才会滚动布局避免TextField被遮挡 - 登录按钮不会被顶到键盘上方(下面几种方案都没实现这需求,有知道解决方案的大大回复下?)
想过的各种方案
方案1
return Container(
child: Column(
children: <Widget>[
Expanded(
child: Container(
color: Colors.pink[50],
child: SingleChildScrollView(
child: Column(
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'username', hintText: 'username'),
),
TextField(
decoration: InputDecoration(labelText: 'password', hintText: 'password'),
),
],
)),
),
),
RaisedButton(
child: Text('login'),
onPressed: () {},
)
],
),
);
将【登录】按钮单独拎出来,SingleChildScrollView
只包裹上面部分内容。
这样有个问题,就是【登录】按钮在键盘弹起时会跑到键盘上面
方案2
@override
Widget build(BuildContext context) {
//屏幕高度-Appbar高度-标题栏高度
var height = MediaQuery.of(context).size.height -
kToolbarHeight -
MediaQuery.of(context).padding.vertical;
return SingleChildScrollView(
child: Container(
height: height,
color: Colors.pink[50],
child: Column(
children: <Widget>[
Container(
height: 400,
),
TextField(
decoration: InputDecoration(labelText: 'username', hintText: 'username'),
),
TextField(
decoration: InputDecoration(labelText: 'password', hintText: 'password'),
),
Spacer(),
RaisedButton(
child: Text('login'),
onPressed: () {},
)
],
),
),
);
}
SingleChildScrollView
的child高度默认是wrap的,计算屏幕的高度,赋值给container,可以使按钮放置在底部
这样有个问题是如果屏幕内容比较多,会出现BOTTOM OVERFLOWED BY ** PIXELS
的报错。该方案不可取
方案3
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints:
BoxConstraints(minWidth: constraints.maxWidth, minHeight: constraints.maxHeight),
child: IntrinsicHeight(
child: Column(
children: <Widget>[
Container(
height: 400,
),
TextField(
decoration: InputDecoration(labelText: 'username', hintText: 'username'),
),
TextField(
decoration: InputDecoration(labelText: 'password', hintText: 'password'),
),
Spacer(),
RaisedButton(
child: Text('login'),
onPressed: () {},
)
],
),
),
),
);
},
);
}
- 使用
LayoutBuilder
,可以获取parent的布局约束,根据parent的最大宽高来设置ConstrainedBox
的宽高 IntrinsicHeight
可以将child的高度变为最大高度
但这样做还是会遇到【键盘弹出时按钮上移】的问题,暂时还没想到解决办法