我是Flutter的新手,正在尝试实现网格列表。

我用GridView做到了。

我希望我的GridView默认在每行显示2个项目

当用户单击AppBar上的按钮时,

我想更改GridView的计数

这样一来,每行只能显示一项。

要实现此行为,

我创建了MyApp_GridCountButtonMainList
MyApp是保存StatefulWidget_gridCount
_GridCountButtonStatelessWidget,从MyApp接收侦听器,并在按下侦听器时调用它。
MainList是保存GridView的代码。

gridview - Flutter GridView计数更新给出错误的滚动位置-LMLPHP
gridview - Flutter GridView计数更新给出错误的滚动位置-LMLPHP

如您所见,更改网格是可行的,

但是GridView的滚动位置不是我想要的。

似乎它保持了滚动的绝对值。

如何保持屏幕上的第一项相同?

最佳答案

我大致解决了我的问题,因此该解决方案在其他情况下可能不起作用。

最佳解决方案可能是

最好的解决方案可能是使用ScrollController侦听并移至使用项目的height计算的特定偏移量。

为了获取该项目的height,我在initState()回调中找到了一种方法,但是我将List设为StatelessWidget,因此它没有initState()

我做了什么

我的案子

因此,我只是使用项目大小的比例来获得适当的偏移量。

就我而言,我必须每行显示1或2个项目,分别为grid1grid2

因此,我将grid1grid2的偏移量存储到offsetoffset2

那么offset1offset2之间的关系将是offset1 = offset2*4,因为当grid1可以显示四个具有相同空格的项目时,grid2只能显示1个项目。

为什么不只是offset

我尝试仅使用一个offset变量来存储grid1的偏移量。

调用滚动事件时,我计算了offset始终保持grid1的偏移量。

但是,如果没有滚动,则不会调用scroll事件。

所以当我

  • grid1切换到grid2
  • 不做任何滚动,
  • grid2切换到grid1
  • offset的值保持不变,并被识别为grid2的偏移量。

    因此,我分离了offset1offset2来确保哪些偏移量与哪个网格匹配。

    offset1offset2一起

    现在,我有了正确更新的正确值,现在可以设置此值以设置适当的偏移量。

    当我调用setState切换网格时,添加了以下几行。
    setState(() {
      double offset = 0.0; // offset to be set
      if(_gridCount == 2) {
        _gridCount = 1;
        offset = offset1; // set offset1
      } else {
        _gridCount = 2;
        offset = offset2; // set offset2
      }
      _scrollController.jumpTo(offset); // set proper offset
    });
    

    而且有效!

    10-06 08:02