Flutter - Space Evenly in Column 不能按预期工作
Flutter - Space Evenly in Column does not work as expected
Screenshot of the problem
我试图通过在彼此之间留出均匀的空间来将元素放在红色框中。 (比如给每个权重 1)。为此,我将 "mainAxisAlignment: MainAxisAlignment.spaceEvenly" 放在父列中,但它不起作用。
Container(
margin: EdgeInsets.only(bottom: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
CachedNetworkImage(
imageUrl:
"https://image.tmdb.org/t/p/w500/${movieDetails
.posterPath}",
height: 120.0,
fit: BoxFit.fill),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, //NOT WORKING!
children: <Widget>[
generateRow(
Strings.released, movieDetails.releaseDate),
generateRow(Strings.runtime,
movieDetails.runtime.toString()),
generateRow(Strings.budget,
movieDetails.budget.toString())
],
)))
],
)),
这是电影图片和红框的代码。我创建了一个包含 2 个元素的行。第一张是那个图,第二张是红框的。
Row generateRow(String key, String value) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[Text(key), Text(value)],
); }
我的 generateRow 方法
我该如何解决这个问题?
试试这个:
new Container(
margin: EdgeInsets.only(bottom: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
CachedNetworkImage(
imageUrl:
"https://image.tmdb.org/t/p/w500/${movieDetails
.posterPath}",
height: 120.0,
fit: BoxFit.fill),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, //NOT WORKING!
children: <Widget>[
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
new Text("Released : "),
new Text("25-07-2018 "),
],
),
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
new Text("Released : "),
new Text("25-07-2018 "),
],
),
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
new Text("Released : "),
new Text("25-07-2018 "),
],
),
],
)))
],
)),
因为你给 image
的高度是 120.0
,你能为另一个 Container
child 做同样的事情吗?通过给出这个,我能够实现你想要的。
代码片段:
Container(
margin: EdgeInsets.only(bottom: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
CachedNetworkImage(
imageUrl:
"https://image.tmdb.org/t/p/w500/${movieDetails
.posterPath}",
height: 120.0,
fit: BoxFit.fill),
Expanded(
child: Container(
height: 120.0 //added to fix
margin: EdgeInsets.only(left: 8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, //NOT WORKING!
children: <Widget>[
generateRow(
Strings.released, movieDetails.releaseDate),
generateRow(Strings.runtime,
movieDetails.runtime.toString()),
generateRow(Strings.budget,
movieDetails.budget.toString())
],
)))
],
)),
调试提示:
- 我用
Flutter Inspector
找到了问题所在。 Refer
- 参考下图。即使我们给了
Expanded
,它也只占图像大小的一半。这里Expanded
的大小由child的大小决定(几乎是图像大小的一半)。
另一种实现结果的方法:
Expanded(
child: Center(
child: // your widget here,
),
)
这个应该是Column
的child,才行。
试着看看这个 post:
本质上,Row
中的图像元素使行在横轴上扩展,但行的实际约束没有被修改。这就是 Column
的 mainAxisAlignment: MainAxisAlignment.spaceEvenly
不起作用的原因。它需要一个 parent 约束。这是在 IntrinsicHeight
的帮助下实现的。用它包装 Row
小部件会将行的约束设置为最大 child 的大小(即图像)。
Screenshot of the problem 我试图通过在彼此之间留出均匀的空间来将元素放在红色框中。 (比如给每个权重 1)。为此,我将 "mainAxisAlignment: MainAxisAlignment.spaceEvenly" 放在父列中,但它不起作用。
Container(
margin: EdgeInsets.only(bottom: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
CachedNetworkImage(
imageUrl:
"https://image.tmdb.org/t/p/w500/${movieDetails
.posterPath}",
height: 120.0,
fit: BoxFit.fill),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, //NOT WORKING!
children: <Widget>[
generateRow(
Strings.released, movieDetails.releaseDate),
generateRow(Strings.runtime,
movieDetails.runtime.toString()),
generateRow(Strings.budget,
movieDetails.budget.toString())
],
)))
],
)),
这是电影图片和红框的代码。我创建了一个包含 2 个元素的行。第一张是那个图,第二张是红框的。
Row generateRow(String key, String value) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[Text(key), Text(value)],
); }
我的 generateRow 方法
我该如何解决这个问题?
试试这个:
new Container(
margin: EdgeInsets.only(bottom: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
CachedNetworkImage(
imageUrl:
"https://image.tmdb.org/t/p/w500/${movieDetails
.posterPath}",
height: 120.0,
fit: BoxFit.fill),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, //NOT WORKING!
children: <Widget>[
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
new Text("Released : "),
new Text("25-07-2018 "),
],
),
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
new Text("Released : "),
new Text("25-07-2018 "),
],
),
new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
new Text("Released : "),
new Text("25-07-2018 "),
],
),
],
)))
],
)),
因为你给 image
的高度是 120.0
,你能为另一个 Container
child 做同样的事情吗?通过给出这个,我能够实现你想要的。
代码片段:
Container(
margin: EdgeInsets.only(bottom: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
CachedNetworkImage(
imageUrl:
"https://image.tmdb.org/t/p/w500/${movieDetails
.posterPath}",
height: 120.0,
fit: BoxFit.fill),
Expanded(
child: Container(
height: 120.0 //added to fix
margin: EdgeInsets.only(left: 8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, //NOT WORKING!
children: <Widget>[
generateRow(
Strings.released, movieDetails.releaseDate),
generateRow(Strings.runtime,
movieDetails.runtime.toString()),
generateRow(Strings.budget,
movieDetails.budget.toString())
],
)))
],
)),
调试提示:
- 我用
Flutter Inspector
找到了问题所在。 Refer - 参考下图。即使我们给了
Expanded
,它也只占图像大小的一半。这里Expanded
的大小由child的大小决定(几乎是图像大小的一半)。
另一种实现结果的方法:
Expanded(
child: Center(
child: // your widget here,
),
)
这个应该是Column
的child,才行。
试着看看这个 post:
本质上,Row
中的图像元素使行在横轴上扩展,但行的实际约束没有被修改。这就是 Column
的 mainAxisAlignment: MainAxisAlignment.spaceEvenly
不起作用的原因。它需要一个 parent 约束。这是在 IntrinsicHeight
的帮助下实现的。用它包装 Row
小部件会将行的约束设置为最大 child 的大小(即图像)。