【问题标题】:Dart Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>Dart 未处理的异常:类型 '_InternalLinkedHashMap<String, dynamic>' 不是类型 'Iterable<dynamic> 的子类型
【发布时间】:2021-09-20 22:57:25
【问题描述】:

如何解决问题未处理的异常:类型“_InternalLinkedHashMap”不是“Iterable”类型的子类型我正在尝试从 Android Studio 中的 json Api 解析数据颤振(飞镖)但我不断收到上面的错误,应用程序打开正常但什么也没显示,我在我的 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"
    }
  ]
}

这是我的班级 .dart 文件

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,
       ),
    );
  }
}

【问题讨论】:

    标签: json flutter android-studio dart listview


    【解决方案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 &&
                    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));
        }
        

        【讨论】:

          猜你喜欢
          • 2020-07-14
          • 2021-08-01
          • 1970-01-01
          • 2021-02-11
          • 2021-07-21
          • 2021-09-12
          • 1970-01-01
          • 2020-08-20
          相关资源
          最近更新 更多