如何显示我的List <object>到Listview?

时间:2019-03-21 13:19:08

标签: dart flutter

我有一个Json文件作为资产。解析工作完美,但是当我使用json中的列表时,会引发错误。 “该吸气剂被调用为空”

这是我的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中,它将引发错误。 我该如何解决这个问题?

感谢帮助:)

1 个答案:

答案 0 :(得分:2)

这是因为您的函数是异步的,并且在构建列表之前不会返回。到那时为止,列表还没有初始化。首先将小部件从无状态更改为有状态。然后执行以下操作:

    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();