我有一个JSON文件作为资产。解析非常完美,但是当我使用JSON中的列表时,会出现错误。" getter在null上被称为"
在这里我的jsoncode:
class Biersorten{
final List<Bier> biersorten;
Biersorten({
this.biersorten
});
factory Biersorten.fromJson(List<dynamic> parsedJson){
List<Bier> listBiersorten = new List<Bier>();
listBiersorten = parsedJson.map((i)=>Bier.fromJson(i)).toList();
return new Biersorten(
biersorten: listBiersorten,
);
}
}
class Bier{
int id;
String name;
String firmenname;
String alkoholgehalt;
Bier({this.id, this.name, this.firmenname, this.alkoholgehalt});
factory Bier.fromJson(Map<String, dynamic> parsedJson){
return Bier(
id: parsedJson["id"],
name : parsedJson["name"],
firmenname : parsedJson ["firmenname"],
alkoholgehalt: parsedJson["alkoholgehalt"]
);
}
}
在这里我的homepagecode:
class MyHomePage extends StatelessWidget {
final String title;
Biersorten biersorten;
MyHomePage({this.title}){
loadBier();
}
Future<String> _loadBierAsset() async {
return await rootBundle.loadString("assets/JSON/Beer.json");
}
Future loadBier() async {
String jsonString = await _loadBierAsset();
final jsonResponse = json.decode(jsonString);
biersorten = new Biersorten.fromJson(jsonResponse);
print(biersorten.biersorten[0].alkoholgehalt);
}
Widget getCard(String title){
return Card(
child: Container(
height: 50,
child: Center(
child: Text(title),
),
)
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Column(
children: <Widget>[
ListView.builder(
itemCount: biersorten.biersorten.length,
itemBuilder: (context, i){
return getCard(biersorten.biersorten[i].name);
},
)
],
),
);
}
}
在函数 _loadBierAsset()
中,我可以使用列表,但是在listView.builder中,它丢了一个错误。我该如何解决这个问题?
感谢您的帮助:)
这是因为您的函数是异步的,并且在构建列表之前不会返回。直到那时,列表尚未初始化。首先将您的小部件从无状态更改为状态。然后这样做:
body: biersorten!=null ?
Column(
children: <Widget>[
ListView.builder(
itemCount: biersorten.biersorten.length,
itemBuilder: (context, i){
return getCard(biersorten.biersorten[i].name);
},
)
],
): Center(child: CircularProgressIndicator()),
并将您的LoadBier功能更改为
Future loadBier() async {
String jsonString = await _loadBierAsset();
final jsonResponse = json.decode(jsonString);
setState((){
biersorten = new Biersorten.fromJson(jsonResponse);
});
print(biersorten.biersorten[0].alkoholgehalt);
}
和在您的Initstate()中添加
loadBier();