Переменная ширина Flutter Gridview или StaggeredGridview / переменное количество элементов для заполнения столбца

Я пытаюсь отобразить вид сетки с переменными номерами и кнопками ширины, например:

введите здесь описание изображения

Но то, с чем я столкнулся при попытке просмотра сетки, — это фиксированное количество кнопок и фиксированная ширина, например:

введите здесь описание изображения

Первоначально я думал, что это проблема с кнопками, имеющими слишком много отступов по умолчанию, но это не проблема, я смог это исправить, и у меня все еще есть та же проблема с сеткой.

Я пробовал конструктор Gridview следующим образом:

GridView.builder(
      shrinkWrap: true,
      physics: NeverScrollableScrollPhysics(),
      gridDelegate:
      SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 3.5, mainAxisSpacing: 4, crossAxisSpacing: 4),
      itemBuilder: (BuildContext context, int index) {
        return InkWell(
          onTap: () {
            //Navigator.of(context).pushNamed(HomePageResultsScreen.id);
          },
          child: ButtonTheme(
            minWidth: 16,
            height: 30,
            child: RaisedButton(
              padding: EdgeInsets.all(8.0),
              materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
              color: Colors.white,
              child:
              Center(
                child: Row(
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    CachedNetworkImage(fit: BoxFit.contain,
                      height: 40,
                      width: 40,
                      placeholder: (context, url) => new CircularProgressIndicator(),
                      imageUrl: snapshot.data.documents[index]['icon'].toString(),
                    ),
                    Text(snapshot.data.documents[index]['name'].toString(), textAlign: TextAlign.right, style: TextStyle(fontSize:  10, color: Colors.black,),),

                  ],
                ),
              ),
              onPressed: (){

              },
            ),
          ),

        );
      },
      itemCount: snapshot.data.documents.length,
    );

Я также отредактировал атрибуты построителя, чтобы иметь SliverGridDelagateWithMaxCrossAxisExtent и другие атрибуты. Я знаю, что кнопки в том виде, в каком они есть, если они не размещены внутри сетки, будут уменьшаться до минимального размера, но когда они находятся в сетке, они расширяются, чтобы заполнить весь столбец.

Я также пробовал множество способов, заменив вид сетки на шахматный вид сетки, например:

StaggeredGridView.countBuilder(
        shrinkWrap: true,
        physics: NeverScrollableScrollPhysics(),
        crossAxisCount: 3,
        staggeredTileBuilder: (int index) =>
        new StaggeredTile.count(2, index.isEven ? 2 : 1),
        itemBuilder: (BuildContext context, int index) {
          return InkWell(
            onTap: () {
              //Navigator.of(context).pushNamed(HomePageResultsScreen.id);
            },
            child: ButtonTheme(
              minWidth: 16,
              height: 30,
              child: RaisedButton(
                padding: EdgeInsets.all(8.0),
                materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                color: Colors.white,
                child:
                Row(
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    CachedNetworkImage(fit: BoxFit.contain,
                      height: 20,
                      width: 20,
                      placeholder: (context, url) => new CircularProgressIndicator(),
                      imageUrl: snapshot.data.documents[index]['icon'].toString(),
                    ),
                    Text(snapshot.data.documents[index]['name'].toString(), textAlign: TextAlign.center, style: TextStyle(fontSize:  10, color: Colors.black,),),

                  ],
                ),
                onPressed: (){

                },
              ),
            ),

          );
        },
        itemCount: snapshot.data.documents.length,
      ),

Я пробовал и StaggeredGridView.countBuilder, и StaggeredGridView.extent, но оба они еще дальше от того, что я себе представлял. Это просто заканчивается одной кнопкой на строку gridview (выглядит как список).

Я не уверен, что я делаю неправильно и возможно ли это вообще с этими виджетами.

Спасибо за вашу помощь


person Nicholas Muir    schedule 27.05.2019    source источник
comment
вам нужен виджет Wrap вместо GtaggeredGridView   -  person    schedule 27.05.2019
comment
Вы нашли какое-нибудь решение?   -  person Naeem    schedule 14.12.2020


Ответы (2)


вам нужно использовать StaggeredGridView, и вам нужно найти логику для расчета ширины элемента и установки StaggeredTile.count.

  final List<String> testing = ['Baby Foods', 'Confectionery', 'Coffee', 'Packets & Units','Packets & Units unis', 'Processed Cheese', 'Factional Care', 'Sauce', 'Sauc'];

    Container(
                width: width,
                child: StaggeredGridView.countBuilder(
                  itemCount: resting.length,
                  physics: NeverScrollableScrollPhysics(),
                  shrinkWrap: true,
                  crossAxisCount: 8,
                  staggeredTileBuilder: (int index) {
                    if (testing[index].length < 5) {
                      return StaggeredTile.count(2, 1);
                    } else if (testing[index].length < 16) {
                      return StaggeredTile.count(3, 1);
                    } else {
                      return StaggeredTile.count(4, 1);
                    }
                  },
                  mainAxisSpacing: 12.0,
                  crossAxisSpacing: 10.0,
                  itemBuilder: (BuildContext context, int index) {
                    return TextButton(
                      child: Text(testing[index]),
                      onPressed: () {},
                    );
                  },
                ),
              ),
person BloodLoss    schedule 11.01.2021

person    schedule
comment
Привет, анупам дас, добро пожаловать. Пожалуйста, рассмотрите возможность добавления дополнительной информации. - person Tiago Martins Peres 李大仁; 28.12.2019
comment
github.com/Anup2712/Straggergridview_flutter См. здесь весь код - person anupam das; 11.06.2020