如何将列表视图放在SingleChildScrollView中,但防止它们分开滚动?

时间:2019-05-14 13:00:01

标签: dart flutter

我有一个像这样的小部件树:

SingleChildScrollView
   Column
     Container
       ListView(or GridView)

问题是当我的小部件树如上时,它给我错误

  

需要油漆

所以我这样改变我的小部件树:

Column
     Container
       ListView(or GridView)

但是在这种情况下,ListView或GridView部分会分别滚动,我希望整个窗口小部件树都可以滚动。您如何看待我?

6 个答案:

答案 0 :(得分:10)

正如其他答案所建议的那样,您可以通过设置shrinkWrap: true, physics: NeverScrollableScrollPhysics()来做到这一点,但是构建收缩包装的列表视图比构建普通的列表视图更昂贵,我认为在上使用map()是一个好主意列表。

Column(
  children: <Widget>[
    ...itemList.map((item) {
       return Text(item);
    }).toList(),
  ],
),

答案 1 :(得分:5)

为什么会发生?

发生这种情况是因为ColumnListView都分别占据了整个屏幕空间,这是默认行为。

如何解决问题?

要解决上述问题,我们必须禁用Listview的滚动,这可以通过shrinkWrapphysics属性来实现

shrinkWrap:true -它强制ListView仅占用所需的空间,而不是整个屏幕。

物理:NeverScrollableScrollPhysics()-它禁用了ListView的滚动功能,这意味着现在我们只有SingleChildScrollView提供滚动功能。

代码:

SingleChildScrollView
   Column
     Container
        ListView(
                shrinkWrap: true,
                physics: NeverScrollableScrollPhysics(),
                //...
                )

https://medium.com/flutterworld/flutter-problem-listview-vs-column-singlechildscrollview-43fdde0fa355

注意:在ListView以上的行为也将适用于GridView

答案 2 :(得分:4)

对我来说,将primary设置为false并将shrinkWrap设置为true即可。

ListView(
   primary: false,
   shrinkWrap: true,
),

答案 3 :(得分:2)

我正在使用嵌套的Listviews,这对我有所帮助。将这些行添加到您所有的ListviewBuilders

ListView(
   shrinkWrap: true,
   primary: false,
),

答案 4 :(得分:1)

您可以使用第一个小部件树并应用以下更改:

  1. 在每个ListViewGridView中设置shrinkWrap: true。这样可以修复您在哪里得到的错误消息。
  2. 在每个ListViewGridView中设置physics: NeverScrollableScrollPhysics()。这将禁用它们的滚动,而新的操作只能在SingleChildScrollView
  3. 上滚动

答案 5 :(得分:1)

在您的primary中将false设置为ListView

ListView(
   primary: false,
),

这应该防止它单独滚动。