Как отобразить вложенный ответ JSON api в виде сетки в flutter?

#flutter #flutter-layout

#flutter #flutter-layout

Вопрос:

Я создаю приложение с использованием flutter. Я хочу показать gridview, а внутри этого gridview мне нужен listview данных. У меня есть JSON Api, ответ которого выглядит следующим образом.

Это массив объекта. Я хочу показать свойство title и price объекта в gridview и свойство services внутри listview в этом gridview. Я использую Futurebuilder . Я не уверен, следует ли использовать внутри Futurebuilder gridview.count или gridviewbuilder . Для достижения listview я должен использовать ListViewbuilder под этим gridviewbuilder или gridview.count ? Есть другие идеи для достижения этого?

      "title": "EXPRESS 2",
     "price": 500,
     "services": [
       {
         "_id": "5ca07706e8f4c521f0010567",
         "serviceId": "5c9081e3ae535e0c549fa0fe",
         "name": "DENT SECTION"
       },
       {
         "_id": "5ca07706e8f4c521f0010566",
         "serviceId": "5c90820aae535e0c549fa100",
         "name": "ELECTRICAL SYSTEM"
       }
     ],
     "id": "5ca07706e8f4c521f0010565"
   },```







  

Ответ №1:

GridView.count : Создает прокручиваемый 2D-массив виджетов с фиксированным количеством плиток на поперечной оси

и

GridView.builder : Создает прокручиваемый 2D-массив виджетов, которые создаются по запросу.

So use the GridView.builder

и попробуйте этот код для привязки ваших данных

  GridView.builder(
      shrinkWrap: true,
      itemCount: itemDataList.length,
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2,childAspectRatio: 0.6),
      itemBuilder: (BuildContext context, int index){
        return Card(
          elevation: 6.0,
          child: Column(
            mainAxisSize: MainAxisSize.max,
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Center(
                child: Text(itemDataList[index].title),
              ),

              displayItem("id ", itemDataList[index].id),
              displayItem("price ", itemDataList[index].price.toString()),
              ListView.builder
                (
                  physics: NeverScrollableScrollPhysics(),
                  shrinkWrap: true,
                  itemCount: itemDataList[index].services.length,
                  itemBuilder: (BuildContext ctxt, int indx) {
                    return new Column(
                      mainAxisSize: MainAxisSize.max,
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Divider(
                          height: 2,
                          color: Colors.black,
                        ),
                        displayItem("_Id", itemDataList[index].services[indx].sId),
                        displayItem("Service Id", itemDataList[index].services[indx].serviceId),
                        displayItem("Service name", itemDataList[index].services[indx].name),
                      ],
                    );
                  }
              ),
            ],
          ),
        );
      },
    ),
  )



Widget displayItem(String key, String value){
    return Padding(
      padding: const EdgeInsets.all(2.0),
      child: Text('$key : $value', style: TextStyle(fontSize: 11),),
    );
  }