समस्या को कैसे ठीक किया जा सकता है अनहेल्ड अपवाद: टाइप करें '_InternalLinkedHashMap<स्ट्रिंग, डायनामिक>' टाइप 'इटरेबल' का उप-प्रकार नहीं है मैं एंड्रॉइड स्टूडियो स्पंदन (डार्ट) में एक जेसन एपीआई से डेटा पार्स करने की कोशिश कर रहा हूं। लेकिन मुझे उपरोक्त त्रुटि मिल रही है, ऐप ठीक खुलता है लेकिन कुछ भी प्रदर्शित नहीं करता है और मुझे अपने लॉगकैट में त्रुटि मिलती है। किसी भी सुझाव की बहुत सराहना की जाएगी।

//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"];
  }
}

और मेरी मुख्य .dart फ़ाइल

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,
       ),
    );
  }
}
0
Serenity Emmanuel 11 जुलाई 2021, 15:15

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि @ हैकर 1024 ने कहा, आप वहां कुंजी खो रहे हैं।

यदि आप एपीआई से डेटा प्राप्त कर रहे हैं, तो 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 &&
                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");
          }),
    );
  }
1
Yeasin Sheikh 11 जुलाई 2021, 12:59

आपके उदाहरण में, datasJson "data" कुंजी वाला नक्शा है। आप "data" कुंजी को असाइन की गई सूची पर पुनरावृति करना चाहते हैं:

var datasJson = json.decode(response.body)['data'];
0
hacker1024 11 जुलाई 2021, 12:34