在下图中,我要实现的目的是让绿色部分Scrollable
,因为如果弹起键盘,它不会给我渲染错误。
整个屏幕只是一个Column
,其中黄色部分是自定义窗口小部件,绿色部分中的另一个Column
。
我尝试了不同的解决方案。 将整个Column包装到SingleChildScrollView中,但是我希望黄色部分固定在顶部。 我还尝试过仅将绿色部分包装到SingleChildScrollView中,但是它不起作用(仍出现“渲染错误”)。
我已经看到可以使用SliverAppBar
,但是我想使用我的自定义小部件(黄色部分)来实现。
我有点卡住了。
Scaffold(
body: SafeArea(
child: Column(
children: [
AppBarWidget(height: size.height * 0.15),
Container(
height: size.height - size.height * 0.15 - mediaQuery.padding.top,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
EditableAvatarWidget(
circleRadius: circleRadius,
badge: test,
border: Border.all(color: test.mainColor, width: 5),
),
Column(
children: [
Text(
"Name Surname",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 26,
color: Global.blackGrey),
),
SizedBox(height: 10),
Text(
"mail@mail.com",
style: TextStyle(fontSize: 18, color: Colors.grey),
)
],
),
Padding(
padding: EdgeInsets.symmetric(
horizontal: size.width / 6, vertical: 0),
child: FlatCustomButton(
onPress: () {},
background: Global.editProfileButton,
text: "Edit profile",
textColor: Global.blackGrey,
inkwellColor: Colors.black,
),
)
],
),
),
],
),
),
);
我可能还会考虑实现ListView(?),但是正如您所看到的,我在Column中设置了mainAxisAlignment: MainAxisAlignment.spaceAround
,使其已经具有我的UI首选项。
您知道我如何实现这一目标吗?
TL; DR:仅滚动属于另一列(整个屏幕)的GreenPart(列),让Yellow Part停留在该固定位置
答案 0 :(得分:1)
您可以像尝试过的那样使用SliverAppBar,但是在其中有flexibleSpaceBar,它具有可以接受任何类型的小部件的背景属性。
示例代码为here。
答案 1 :(得分:1)
这就是我固定的方式。
我之前将绿色列部分封装在Extended
中,然后封装到SingleChildScrollView
中。
正是我想要的。
现在只滚动绿色部分,出现键盘时黄色部分保持固定位置。
代码:
return Scaffold(
body: SafeArea(
child: Column(
children: [
AppBarWidget(
height: size.height * 0.15,
),
Expanded( //This
child: SingleChildScrollView( // and this fixed my issue
child: Container(
height:
size.height - size.height * 0.15 - mediaQuery.padding.top,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
EditableAvatarWidget(
circleRadius: circleRadius,
badge: test,
border: Border.all(color: test.mainColor, width: 5),
),
Column(
children: [
Text(
"Name Surname",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 26,
color: Global.blackGrey),
),
SizedBox(height: 10),
Text(
"mail@mail.com",
style: TextStyle(fontSize: 18, color: Colors.grey),
)
],
),
Padding(
padding: EdgeInsets.symmetric(
horizontal: size.width / 6, vertical: 0),
child: FlatCustomButton(
onPress: () {},
background: Global.editProfileButton,
text: "Edit profile",
textColor: Global.blackGrey,
inkwellColor: Colors.black,
),
)
],
),
),
),
),
],
),
),
);
答案 2 :(得分:0)
如果您可以将Column
内的SingleChildScrollView
设置为固定高度,
这可能是最好的,即使它像您提供的修复程序中涉及到一些“黑客攻击”一样。
但是,当您需要在列中灵活/扩展内容时,可以考虑将ConstrainedBox
中的 IntrinsicHeight
与SingleChildScrollView
一起用作{{ 3}}。
我发现,对于相对简单的屏幕,此方法效果很好。例如。 如果您有输入字段并且弹出键盘,则实际上只需要滚动,就像在代码中一样。
LayoutBuilder(
builder: (BuildContext context, BoxConstraints viewportConstraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: viewportConstraints.maxHeight,
),
child: IntrinsicHeight(
child: Column(
children: <Widget>[
...
注意:如果屏幕更复杂,IntrinsicHeight
可能会太昂贵,请参阅SingleChildScrollView's documentation describes了解更多信息。