Flutter GridView.count сжимается при вызове setState для одного из его дочерних элементов

#flutter #datagridview

#flutter #datagridview

Вопрос:

У меня есть 4 виджета, которые могут быть видны. Они должны отображаться 2 подряд, но я не могу заранее знать, будут ли видны widget1 и widget2 или widget1 и widget4, поэтому я не знаю, как обернуть их в строку.

Я пытался использовать 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 и предотвратить это?

Ответ №1:

Я до сих пор не знаю, почему это происходит, но использование 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  ;
            });
          },
        )
      ],
    ),
  );
}