如何在列表视图中显示我的<Object>列表?



我有一个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();

相关内容

最新更新