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