我是Flutter的新手,正在尝试实现网格列表。
我用GridView
做到了。
我希望我的GridView
默认在每行显示2个项目
当用户单击AppBar
上的按钮时,
我想更改GridView
的计数
这样一来,每行只能显示一项。
要实现此行为,
我创建了MyApp
,_GridCountButton
和MainList
。MyApp
是保存StatefulWidget
的_gridCount
。_GridCountButton
是StatelessWidget
,从MyApp
接收侦听器,并在按下侦听器时调用它。MainList
是保存GridView
的代码。
如您所见,更改网格是可行的,
但是GridView
的滚动位置不是我想要的。
似乎它保持了滚动的绝对值。
如何保持屏幕上的第一项相同?
最佳答案
我大致解决了我的问题,因此该解决方案在其他情况下可能不起作用。
最佳解决方案可能是
最好的解决方案可能是使用ScrollController
侦听并移至使用项目的height
计算的特定偏移量。
为了获取该项目的height
,我在initState()
回调中找到了一种方法,但是我将List设为StatelessWidget
,因此它没有initState()
。
我做了什么
我的案子
因此,我只是使用项目大小的比例来获得适当的偏移量。
就我而言,我必须每行显示1或2个项目,分别为grid1
和grid2
。
因此,我将grid1
和grid2
的偏移量存储到offset
和offset2
。
那么offset1
和offset2
之间的关系将是offset1 = offset2*4
,因为当grid1
可以显示四个具有相同空格的项目时,grid2
只能显示1个项目。
为什么不只是offset
?
我尝试仅使用一个offset
变量来存储grid1
的偏移量。
调用滚动事件时,我计算了offset
始终保持grid1
的偏移量。
但是,如果没有滚动,则不会调用scroll事件。
所以当我
grid1
切换到grid2
和grid2
切换到grid1
和offset
的值保持不变,并被识别为grid2
的偏移量。因此,我分离了
offset1
和offset2
来确保哪些偏移量与哪个网格匹配。与
offset1
和offset2
一起现在,我有了正确更新的正确值,现在可以设置此值以设置适当的偏移量。
当我调用
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
});
而且有效!