首页 > 解决方案 > Flutter GridView.count 在其子项上调用 setState 时缩小

问题描述

我有 4 个可能可见的小部件。它们应该连续显示2个,但我无法提前知道widget1和widget2是否可见,或者widget1和widget4,所以我不知道如何将它们包装在Row中。

我尝试使用 GridView.count,但是当其中一个被标记为脏并重建时我遇到了问题。即使我无条件地对两个小部件进行硬编码,我也会遇到这个问题:

return Container(
      child: GridView.count(
        shrinkWrap: true,
        physics: ScrollPhysics(),
        crossAxisCount: 2,
        children: [
          IncrementDecrementNumber(label: config['optional'][1]['data_value'], value: vel1,
            onMinusPressed: (){
              setState(() {
                if (vel1 > 0)
                  vel1--;
              });
            },
            onPlusPressed: () {
              setState(() {
                vel1++;
              });
            },
          ),
          IncrementDecrementNumber(label: config['optional'][3]['data_value'], value: vel2,
            onMinusPressed: (){
              setState(() {
                if (vel2 > 0)
                  vel2--;
              });
            },
            onPlusPressed: () {
              setState(() {
                vel2++;
              });
            },
          )
        ],
      ),
    );
  }

它看起来像这样:

在此处输入图像描述

当我单击任何 + 或 - 按钮时,会发生这种情况(并且每次单击小部件都会缩小,直到它们消失):

在此处输入图像描述

有没有办法使用 GridView 并防止这种情况发生?

标签: flutterdatagridview

解决方案


我仍然不知道为什么会发生这种情况,但是使用 GridView 代替 GridView.count 似乎可以在没有缩小的情况下工作。

return Container(
    child: GridView.count(
      shrinkWrap: true,
      physics: ScrollPhysics(),
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 2,
        crossAxisSpacing: 5.0,
        mainAxisSpacing: 5.0,
      ),
      children: [
        IncrementDecrementNumber(label: config['optional'][1]['data_value'], value: vel1,
          onMinusPressed: (){
            setState(() {
              if (vel1 > 0)
                vel1--;
            });
          },
          onPlusPressed: () {
            setState(() {
              vel1++;
            });
          },
        ),
        IncrementDecrementNumber(label: config['optional'][3]['data_value'], value: vel2,
          onMinusPressed: (){
            setState(() {
              if (vel2 > 0)
                vel2--;
            });
          },
          onPlusPressed: () {
            setState(() {
              vel2++;
            });
          },
        )
      ],
    ),
  );
}

推荐阅读