Flutter中的ListView和SingleChildScrollView有什么区别?

33

我看过一些使用ListView作为Scaffold主要body元素的示例,在一些教程中则采用了SingleChildScrollView。我理解的是它们都允许根据配置的方向滚动某个轴,但无法确定什么时候应该使用其中之一?

ListView:

Scaffold
  body : ListView
    children : Padding/Container

SingleChildScrollView:

Scaffold
  body : SingleChildScrollView
    child : Column
3个回答

101

7
谢谢@Remi的答案,很有帮助。只是想知道你是如何获得这么多Flutter方面的知识的?你有什么推荐的学习资源吗? - BeingSuman
15
好奇心。我之前也问过自己所有这些问题,并自主搜索答案。 - Rémi Rousselet
4
Listview 本身并不高效或者说优化,因为它会渲染和绘制列表中的所有项。Listview.builder() 是使用延迟加载并高效利用资源的方法。 - Davoud Badamchi
5
@Badamchi,没有哪个ListView会进行懒加载渲染。唯一的区别是children参数的内存分配方式。 - Rémi Rousselet
6
你好,Rémi。你说“ListView不够灵活。”- 你能解释一下你具体指的是什么吗? - cofirazak
显示剩余3条评论

11

ListView:用于在n个元素中渲染相同类型的小部件。

SingleChildScrollView:用于在n个元素中渲染不同类型的小部件。

理想情况下,这两种情况都需要滚动,Listview具有默认行为,但是列和其他小部件没有,所以需要使用SingleChildScrollView

更新: 在选择ListView时需要注意一个重要点。

 ListView() -- Render all the items in the list, even if it is not visible. 

`ListView.Builder()` -- Render only visible items on the screen. 

1
当您的屏幕中只有ListView小部件时,请使用ListView,但对于不同的小部件,请使用SingleChildScrollView,因为它具有滚动其内部声明的所有子小部件的能力。 - Jitesh Mohite
使用ListView来展示不同类型的小部件是没有问题的。 - ig-dev
@ig-dev,您能否详细说明您的说法?为什么使用ListView来显示不同类型的小部件没有问题呢? - chemturion
1
@chemturion 另一种方式:为什么非同质化的子元素有任何问题?并没有这样的限制。文档也没有提到这样的事情,而且它按预期工作。你可以使用它来布局你的应用程序。这个主张是由OP凭空捏造的。 - ig-dev
1
我在ListView的默认构造函数下有一个非常复杂的布局。某些子元素会在我滑动屏幕时反复重建。而当我使用SingleChildScrollView + Column时,所有子元素只会被构建一次。 - Hasan El-Hefnawy
显示剩余2条评论

4

ListView是在你有一个需要渲染的UI小部件列表,并且此类小部件的数量是动态的时使用的。

例如:你只需要在屏幕上显示联系人列表,而列表项在UI上和类别上大致相似。那么你可以使用ListView。

SingleChildScrollView可以与Android中的"ScrollView"进行比较。假设你有许多UI小部件(按钮、输入字段、卡片等),它们开始超出屏幕范围。在这种情况下,你的小部件将会溢出并且你会看到警告。为了解决这个问题,你可以使用SingleChildScrollView来包装你的UI小部件。

对于你的用例,“推荐”部分使用ListView是一个不错的选择。


感谢@Kumar的答案,非常有帮助。 - BeingSuman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接