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

What is the difference between ListView and SingleChildScrollView in Flutter?

我见过几个使用 ListView 作为 Scaffold 的主要 body 元素的例子,在一些教程中,它是 SingleChildScrollView。我所理解的是两者都允许根据配置的方向滚动某些轴,但无法弄清楚何时使用一个而不是另一个?

列表视图:

Scaffold
  body : ListView
    children : Padding/Container

SingleChildScrollView:

Scaffold
  body : SingleChildScrollView
    child : Column

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. 

ListView,如果您有一个要呈现的 UI 小部件列表,并且此类小部件的数量是动态的,您将使用。

例如:您只需要在屏幕上显示联系人列表,列表项或多或少相似(UI 明智和类别明智)。然后您将使用 Listview。

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

对于您的用例,"Recommended" 部分,ListView 将是一个不错的选择。

你可以考虑ListView as an optimisation to the combination of SingleChildScrollView + Column.

通过使用ListView,只有可见的项目才会被安装和涂漆。

另一方面,通过使用 SingleChildScrollView+Column,即使只有少数项目可见,整个项目列表也会被安装+绘制。

权衡是 ListView 不太灵活。所以对于项目数量较少的复杂布局,性能提升可能不值得,在这种情况下我们可以使用 SingleChildScrollView.