尝试在小部件内循环json对象时遇到大麻烦
我从api调用中得到了这个json:
[
{
"id":21,
"name":"John Smit",
"date_birth":"30-09-1983",
"cars":[
{
"id":406,
"car_name":"Ford"
}
]
}
]
和获得此数据的模型:
class Tiro {
final int id;
final String name;
final String date_birth;
final List cars;
Tiro.fromJSON(Map<String, dynamic> jsonMap) :
id= jsonMap['id'],
name= jsonMap['name'],
date_birth= jsonMap['date_birth'],
cars= jsonMap['cars'];
}
现在,我将显示一个ExtensionTile,其文本类似于字符串名称,并且在他的孩子中有一些ListTile产生的循环进入List汽车:
class TiroTile extends StatelessWidget {
final Tiro _tiro;
TiroTile(this._tiro);
@override
Widget build(BuildContext context) {
return Center(
child: Card(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ExpansionTile(
title: Text(_tiro.name),
leading: Icon(Icons.library_books,
color: Colors.red[900],
),
children: <Widget>[
var myCars = jsonDecode(_tiro.cars);
for (var s in myCars){
// here my ListTile
}
],
),
],
),
),
);
}
}
当然这是行不通的,但是我不知道该如何实现。 谢谢您的帮助。
答案 0 :(得分:0)
您需要创建一个Car
类,就像包含Tiro
构造函数的fromJson
类一样。问题是jsonMap['cars']
返回List<dynamic>
。我们需要将其转换为类型List
,然后需要序列化此列表中的每个元素。因此,您需要包括以下更改-
var list = jsonMap['cars'] as List;
在构造函数中,您将执行以下操作-
cars: list.map((i) => Car.fromJson(i)).toList()
最后,看起来像这样-
factory Tiro.fromJSON(Map<String, dynamic> jsonMap){ // The way i have created the constructor is different, but it's upto you
var list = jsonMap['cars'] as List;
return Tiro(
id : jsonMap['id'],
name : jsonMap['name'],
date_birth : jsonMap['date_birth'],
cars: list.map((i) => Car.fromJson(i)).toList()
);
}
还要删除您创建的myCars
变量,在完成上述更改后,您不必解码json。您可以使用_tiro.cars
直接访问列表。
其他-
现在,如果您的Json是对象列表(如您的示例所示),则需要应用类似的逻辑。创建另一个具有字段TiroList
的类List<Tiro> tiros
,并执行上述相同的操作以序列化每一个Singo Tiro。