Необработанное исключение Dart: тип ‘_InternalLinkedHashMap’ не является подтипом типа ‘Итерируемый

#json #flutter #android-studio #dart #listview

Вопрос:

Как можно исправить проблему необработанное исключение типа ‘_InternalLinkedHashMap<String, dynamic=»»>’не является подтипом типа ‘метод’ я пытаюсь разобрать данные из JSON API в Android студия флаттер (дротик), но я продолжаю получать ошибку выше, приложение открывается нормально, но экран ничего не отображает, и я получаю ошибку в моем logcat разработчику. Любое предложение будет высоко оценено.

 //Sample Json//
{
  "data": [
    {
      "title": "Ronix",
      "year": "Year 5",
      "category": "Admin"
    },
    {
      "title": "Ultra",
      "year": "Year 11",
      "category": "Tutor"
    },
    {
      "title": "Sonet",
      "year": "Year 3",
      "category": "Admin"
    }
  ]
}
 

Вот мой класс .файл для дротиков

 class DataClass{
  String title ="";
  String year="";
  String category="";

  DataClass(this.title, this.year, this.category);

  DataClass.fromJson(Map<String, dynamic> json){
    title = json["title"];
    year = json["year"];
    category = json["category"];
  }
}
 

И мой главный .файл для дротиков

 class CreateState1 extends State<JsonData1>{
  List<DataClass> _dataClass = [];

  Future<List<DataClass>> getMovieData() async {
    var response = await http.get(Uri.parse("myjsonApiUrl"));
    var datas = [];
    if(response.statusCode == 200){
      var datasJson = json.decode(response.body);
      for(var dataJson in datasJson){
        datas.add(DataClass.fromJson(dataJson));
      }
    }
    return _dataClass;
  }
  @override
  Widget build(BuildContext context) {
    getMovieData().then((value) {
      setState(() {
        _dataClass.addAll(value);
      });
    });

    return Scaffold(
      backgroundColor: Colors.cyan,
      body: ListView.builder(
          itemBuilder: (context, index) {
            return Card(
                child: Column(
                  children: <Widget>[
                    Text(_dataClass[index].title),
                    Text( _dataClass[index].year),
                    Text(_dataClass[index].category),
                  ],
              ),
            );
          },
          itemCount: _dataClass.length,
       ),
    );
  }
}
 

Ответ №1:

как сказал @hacker1024 , там вам не хватает ключа.

если вы получаете данные из Api, попробуйте использовать FutureBuilder.

Я загружаю из папки «Активы» здесь (не забудьте добавить pubspec.yaml )

 Future<List<DataClass>> getMovieData() async {
    final myJson = await rootBundle.loadString("assets/j.json");
    // var response = await http.get(Uri.parse(myJson));

    // if (response.statusCode == 200) {
    final datasJson = json.decode(myJson)["data"] as List;

    return datasJson.map((js) => DataClass.fromJson(js)).toList();
    // } else
    //   print("http error");
    // return [];
  }
 

И для реализации

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.cyan,
      body: FutureBuilder<List<DataClass>>(
          future: getMovieData(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting)
              return CircularProgressIndicator();

            if (snapshot.hasError)
              return Text(snapshot.error.toString());
            else if (snapshot.hasData amp;amp;
                snapshot.connectionState == ConnectionState.done)
              return ListView.builder(
                itemBuilder: (context, index) {
                  return Card(
                    child: Column(
                      children: <Widget>[
                        Text(snapshot.data![index].title),
                        Text(snapshot.data![index].year),
                        Text(snapshot.data![index].category),
                      ],
                    ),
                  );
                },
                itemCount: snapshot.data!.length,
              );
            else
              return Text("impliment more");
          }),
    );
  }
 

Ответ №2:

В вашем примере datasJson это карта с data ключом»». Вы хотите повторить список, назначенный ключу « data » :

 var datasJson = json.decode(response.body)['data'];
 

Ответ №3:

вместо

 for(var dataJson in datasJson){
        datas.add(DataClass.fromJson(dataJson));
}
 

используйте это

 for (var dataJson in datasJson['data']) {
    datas.add(DataClass.fromJson(dataJson));
}