Как вызвать вложенные данные json с помощью API во флаттере?

avatar
parveen
9 августа 2021 в 06:29
849
3
3

Мой JSON выглядит следующим образом:

{
Info: [
       {
         c_type_id: "1",
         cleaning type: "A Cleaning"
        },
        {
          c_type_id: "2",
          cleaning type: "B Cleaning"
         },
         {
           c_type_id: "3",
           cleaning type: "C Cleaning"
         },
         {
           c_type_id: "4",
           cleaning type: "D Cleaning"
          },
          {
            c_type_id: "5",
            cleaning type: "E Cleaning"
           },
       ]
}

и вот код: Следующий код создан этим Класс 1:

class Album {
   List<Info> info;
   Album({this.info})
     Album.fromJson(Map<String, dynamic> json) {
      if (json['Info'] != null) {
       info =  List<Info>.empty();
       json['Info'].forEach((v) {
       info.add(new Info.fromJson(v));
      });
     }
    }

   Map<String, dynamic> toJson() {
     final Map<String, dynamic> data = new Map<String, dynamic>();
      if (this.info != null) {
      data['Info'] = this.info.map((v) => v.toJson()).toList();
      }
     return data;
     }
    }

класс 2:

class Info {
  String cTypeId;
  String cleaningType;
  Info({this.cTypeId, this.cleaningType});
    Info.fromJson(Map<String, dynamic> json) {
    cTypeId = json['c_type_id'];
    cleaningType = json['cleaning type'];
    }
   Map<String, dynamic> toJson() {
   final Map<String, dynamic> data = new Map<String, dynamic>();
   data['c_type_id'] = this.cTypeId;
   data['cleaning type'] = this.cleaningType;
   return data;
 }
}

Это ошибка, которую я получаю при выполнении кода: ошибка: Тип аргумента "Список" не может быть присвоен типу параметра "Строка".

enter image description here

Надеюсь на помощь!

Источник
Dinesh Nagarajan
9 августа 2021 в 06:32
0

проверьте это flutter.dev/docs/cookbook/networking/fetch-data

Ravindra S. Patil
9 августа 2021 в 06:34
0

Если вы получаете данные из API, обратитесь к моему ответу здесь или здесь

Dinesh Nagarajan
9 августа 2021 в 06:35
0

также предоставленные вами данные json не являются действительными JSON.

parveen
9 августа 2021 в 08:03
0

@ Равиндра С. Патил, я пробовал оба, но не получил результата. Теперь эта ошибка показывает «ошибка: оператор« [] »не определен для типа« Альбом »».

Ravindra S. Patil
9 августа 2021 в 08:28
0

Можете ли вы сказать мне, что ваши данные JSON размещены в Интернете? потому что данные моего второго ответа json и ваши данные json выглядят одинаково

parveen
9 августа 2021 в 08:31
0

да, я скопировал и вставил данные JSON здесь выше, и я последовал второму ответу. @Равиндра С. Патил

Ravindra S. Patil
9 августа 2021 в 08:37
0

Можете ли вы поделиться своим URL-адресом json, я пытаюсь решить вашу проблему

Ravindra S. Patil
9 августа 2021 в 09:07
0

@parveen проверь мой ответ, твоя проблема решена

Ответы (3)

avatar
Ravindra S. Patil
9 августа 2021 в 09:06
2

Вы должны попробовать приведенный ниже код, ваша проблема была решена ->

Объявите функцию вызова API

Future<List<dynamic>> getInfoData() async {
    String url = 'https://fillmmaka.com/gigocleanapi/cleanintypes.php';
    var response = await http.get(Uri.parse(url), headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
    });
    return json.decode(response.body)['Info'];
  }

Объявите свой виджет

Center(
    child: FutureBuilder<List<dynamic>>(
      future: getInfoData(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Padding(
            padding: const EdgeInsets.all(8.0),
            child: ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (context, index) {
                var id = snapshot.data[index]['c_type_id'];
                var type = snapshot.data[index]['cleaning type'];

                return Card(
                  shape: RoundedRectangleBorder(
                    side: BorderSide(
                      color: Colors.green.shade300,
                    ),
                    borderRadius: BorderRadius.circular(15.0),
                  ),
                  child: ListTile(
                    leading: Text(id),
                    title: Text(type),
                  ),
                );
              },
            ),
          );
        }
        return CircularProgressIndicator();
      },
    ),
  ),

Ваш экран выглядит так -> enter image description here

Kim Lo
17 мая 2022 в 03:00
0

привет, сэр Равиндра. Могу ли я прокомментировать здесь дополнительный вопрос, связанный с этой проблемой? спасибо

Ravindra S. Patil
17 мая 2022 в 04:36
0

@KimLo Да, конечно, расскажи о своей проблеме

Kim Lo
17 мая 2022 в 05:00
0

что, если у меня есть похожий список, но на этот раз он вложен. Как сделать каждое текстовое поле подсписка уникальным? bcoz в моей программе теперь, всякий раз, когда я ввожу 55 в текстовое поле, оно меняет все текстовое поле в подсписке с тем же индексом. Спасибо! см. ссылку на изображение. imgur.com/IjOqWPJ

avatar
caiopo
9 августа 2021 в 06:38
0

Какова ваша цель? Что вы хотите показать на экране? Например, хотите ли вы показать список со всеми типами очистки?

Вы получаете эту ошибку, поскольку атрибут info в вашем классе Album представляет собой список:

class Album {
   List<Info> info;

Если вы хотите отобразить cleaningType первой информации в списке, вы можете сделать что-то вроде этого:

return Text(snapshot.data.info[0].cleaningType);

Имейте в виду, что это приведет к сбою, если список info пуст.

parveen
9 августа 2021 в 07:54
0

а что, если я хочу показать все данные списка?

avatar
Asim Jawad
9 августа 2021 в 06:35
0

вы пытаетесь получить доступ ко всему списку, просто используйте snapshot.data.info[index].variableName к которому вы хотите получить доступ и все будет хорошо