Flutter:水平列表视图的最小高度
Flutter:水平列表视图的最小高度
我正在尝试在Flutter中创建一个水平滚动的项目列表,并且我希望该列表只占据其子项所需的高度。根据设计,“ListView
尝试扩展以适应其交叉方向上的可用空间”(来自Flutter文档),我也注意到它占据了整个视口的高度,但有没有办法让它不这样做?理想情况下,类似于以下代码(显然不起作用):
new ListView(
scrollDirection: Axis.horizontal,
crossAxisSize: CrossAxisSize.min,
children:
new ListItem(),
new ListItem(),
// ...
],
);
我意识到一种方法是将ListView
包装在具有固定高度的Container
中。但是,我不一定知道项目的高度:
new Container(
height: 97.0,
child: new ListView(
scrollDirection: Axis.horizontal,
children:
new ListItem(),
new ListItem(),
// ...
],
),
);
我通过将Row
嵌套在SingleChildScrollView
中,再将其嵌套在Column
中,并将mainAxisSize: MainAxisSize.min
来“解决”了这个问题。然而,对我来说,这不像是一个解决方案:
new Column(
mainAxisSize: MainAxisSize.min,
children:
new SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: new Row(
children:
new ListItem(),
new ListItem(),
// ...
],
),
),
],
);
Flutter: 水平列表视图的最小高度问题及解决方法
在使用Flutter开发过程中,有时我们需要在水平列表视图(ListView)中设置最小高度。下面介绍了一种使用ConstrainedBox组件来设置最小高度和最大高度的方法:
ConstrainedBox(
constraints: new BoxConstraints(
minHeight: 35.0,
maxHeight: 160.0,
),
child: new ListView(
shrinkWrap: true,
children:
new ListItem(),
new ListItem(),
],
),
)
然而,有人提出了一个问题:“如果我不知道列表项(ListItem)的最小/最大高度,我该如何设置最小高度和最大高度呢?”
对此,有人回答道:“你真的需要知道列表项的最小/最大高度吗?我是说,你可以将高度设置为1到1000之间的任意值,重要的是它会调整ListView的大小以适应期望的高度。如果我漏掉了什么,请告诉我。”
另外,某些情况下自己遇到的问题是ListView会根据最大高度自动调整,所以上述方法对他来说并不适用。
对于这个问题,可以参考这个答案:stackoverflow.com/a/67233853/106941
问题的原因是:在垂直ListView中无法动态设置水平ListView的高度。
解决方法是:如果要求允许(没有无限滚动,元素数量较少等),可以使用SingleChildScrollView替代。具体代码如下:
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: [...],
),
);
其中,一个用户提到他使用了SingleChildScrollView,但是即使在10个元素中也会出现卡顿。他解释说,由于他是一个糟糕的程序员开发的,所以单个元素占用了大量的内存,将单个元素乘以10会导致卡顿。
另外一个用户分享了他解决这个问题的代码片段,他使用了List.generate,使其几乎与ListView.Builder相似。具体代码可以在以下链接中找到:gist.github.com/Abushawish/048acfdaf956640ea6fa8b3991dbbd81
问题的出现原因是:shrinkWrap属性会使ListView沿着主轴方向收缩,但不会沿着交叉轴方向收缩。
解决方法是:将ListView的shrinkWrap属性设置为true,这样就可以使其适应空间而不会扩展。然而,需要注意的是,shrinkWrap会导致滚动视图的内容相对于扩展到最大允许大小而言变得更加昂贵。
为了优化应用性能,最好的解决方法是使用CustomScrollView。
以下是用中文输出的整理文章:
问题:Flutter:水平ListView的最小高度问题
在使用Flutter开发中,有一种问题是关于水平ListView的最小高度的。当我们希望ListView在水平方向上具有最小高度时,我们可能会遇到一些困扰。
解决方法:
解决这个问题的方法是设置ListView的shrinkWrap属性为true。这样,ListView将适应空间而不会扩展。
示例代码:
ListView(
shrinkWrap: true, // 只需设置这个属性
padding: const EdgeInsets.all(8.0),
children: listItems.toList(),
),
需要注意的是,尽管使用shrinkWrap属性可以解决问题,但它可能会影响应用的性能。根据Flutter官方文档(api.flutter.dev)上的说明,shrink wrapping(收缩包装)滚动视图的内容相对于扩展到最大允许大小而言是非常昂贵的。因此,如果需要考虑应用性能,最好的解决方法是使用CustomScrollView。
希望这篇文章能够帮助解决Flutter中关于水平ListView最小高度的问题。如果您有任何疑问,请随时提问。谢谢!
(原文中的内容已经按照问题的出现原因和解决方法进行整理,并进行了适当的排版和修改,以便更好地理解问题和解决方案)