Column inside Column 的 SingleChildScrollView
SingleChildScrollView for Column inside Column
在下图中,我想要实现的是让绿色部分 Scrollable
,因为万一弹出键盘,它不会给我渲染错误。
整个屏幕只是一个 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: 仅让属于另一列(全屏)的绿色部分(列)可滚动,让黄色部分停留在该固定位置
您可以使用 SliverAppBar like you have already tried, but inside that you have flexibleSpaceBar,它的背景 属性 可以接受任何类型的 Widget。
示例代码是here.
我就是这样解决的。
之前我把绿柱部分封装在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,
),
)
],
),
),
),
),
],
),
),
);
如果可以给SingleChildScrollView
里面的Column
设置一个固定的高度,
这可能是最好的,即使它像您提供的修复程序一样涉及一些“黑客攻击”。
但是,当你需要flexible/expanding列中的内容时,你可以考虑在SingleChildScrollView
[=中使用ConstrainedBox
和IntrinsicHeight
31=] 作为 SingleChildScrollView's documentation describes.
我发现对于相对 简单的屏幕 这很有效。例如。 如果你有一个输入字段并且弹出键盘,你真的只需要滚动,就像你的代码一样。
LayoutBuilder(
builder: (BuildContext context, BoxConstraints viewportConstraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: viewportConstraints.maxHeight,
),
child: IntrinsicHeight(
child: Column(
children: <Widget>[
...
注意:对于更复杂的屏幕,IntrinsicHeight
可能成本太高,请参阅 its docs 了解更多信息。
在下图中,我想要实现的是让绿色部分 Scrollable
,因为万一弹出键盘,它不会给我渲染错误。
整个屏幕只是一个 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: 仅让属于另一列(全屏)的绿色部分(列)可滚动,让黄色部分停留在该固定位置
您可以使用 SliverAppBar like you have already tried, but inside that you have flexibleSpaceBar,它的背景 属性 可以接受任何类型的 Widget。
示例代码是here.
我就是这样解决的。
之前我把绿柱部分封装在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,
),
)
],
),
),
),
),
],
),
),
);
如果可以给SingleChildScrollView
里面的Column
设置一个固定的高度,
这可能是最好的,即使它像您提供的修复程序一样涉及一些“黑客攻击”。
但是,当你需要flexible/expanding列中的内容时,你可以考虑在SingleChildScrollView
[=中使用ConstrainedBox
和IntrinsicHeight
31=] 作为 SingleChildScrollView's documentation describes.
我发现对于相对 简单的屏幕 这很有效。例如。 如果你有一个输入字段并且弹出键盘,你真的只需要滚动,就像你的代码一样。
LayoutBuilder(
builder: (BuildContext context, BoxConstraints viewportConstraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: viewportConstraints.maxHeight,
),
child: IntrinsicHeight(
child: Column(
children: <Widget>[
...
注意:对于更复杂的屏幕,IntrinsicHeight
可能成本太高,请参阅 its docs 了解更多信息。