[英]Dart Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>
How can fix the issue Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable' i am trying to parse data from a json Api in Android Studio flutter (dart) but i keep getting the error above, the app open fine but displays nothing and i get the error in my logcat.如何解决未处理的异常:类型“_InternalLinkedHashMap<String, dynamic>”不是“Iterable”类型的子类型我正在尝试从 Android Studio flutter (dart) 中的 json Api 解析数据,但我不断收到上述错误,应用程序打开正常但什么也没显示,我的 logcat 中出现错误。 Any suggestion will be greatly appreciated.任何建议将不胜感激。
//Sample Json//
{
"data": [
{
"title": "Ronix",
"year": "Year 5",
"category": "Admin"
},
{
"title": "Ultra",
"year": "Year 11",
"category": "Tutor"
},
{
"title": "Sonet",
"year": "Year 3",
"category": "Admin"
}
]
}
Here is my class .dart file这是我的班级 .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"];
}
}
And my main .dart file还有我的主要 .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,
),
);
}
}
as @hacker1024 said , you are missing key there.正如@hacker1024 所说,你在那里缺少钥匙。
if you are getting data from Api, try using FutureBuilder.如果您从 Api 获取数据,请尝试使用 FutureBuilder。
I'm loading from assets folder here (dont forget to add on pubspec.yaml
)我正在从这里的资产文件夹加载(不要忘记添加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 [];
}
And for implementation并为实施
@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");
}),
);
}
In your example, datasJson
is a map with a " data
" key.在您的示例中, datasJson
是一个带有“ data
”键的地图。 You want to iterate over the list assigned to the " data
" key:您想遍历分配给“ data
”键的列表:
var datasJson = json.decode(response.body)['data'];
instead of代替
for(var dataJson in datasJson){
datas.add(DataClass.fromJson(dataJson));
}
use this用这个
for (var dataJson in datasJson['data']) {
datas.add(DataClass.fromJson(dataJson));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.