【问题标题】:Flutter Futurebuilder snapshot is nullFlutter Futurebuilder 快照为空
【发布时间】:2020-04-12 00:01:56
【问题描述】:

我尝试使用 FutureBuilder 在 Flutter 的 ListView 中显示 JSON 的结果。 但快照为空,并且显示没有可用数据的消息。

我在这里尝试获取数据:

static Future _getBans() async {
Storage.getLoggedToken().then((token) async {
  var body = {
    "token": token
  };
  final response = await http.post('${URLS.BASE_URL}/punishments.php', headers: ApiService.header, body: json.encode(body));
  if (response.statusCode == 200) {

    List<Ban> bans = [];
    var jsonData = json.decode(response.body)["bans"];
    for(var b in jsonData){
      Ban ban = Ban(b["player"], b["reason"], int.parse(b["end"]), b["by"]);
      bans.add(ban);
    }

    print(response.body);
    print(bans.length);

    return bans;
  } else {
    return null;
  }
});

}

来自这个 JSON 响应

{"status":1,"msg":"OK","bans":[{"player":"DDOSAttacke","reason":"Hacking","end":"1579275471304","by":"DDOSAttacke"}],"mutes":[]}

我的未来建造者。这是快照 null,但元素的数量正在工作。

Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: Text('Aktive Bans'),
  ),
  body: Container(
    child: FutureBuilder(
      future: _getBans(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.data == null) {
          return Container(
            child: Center(
                child: Text('Keine aktiven Ban vorhanden')
            ),
          );
        } else {
          return ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (BuildContext context, int index) {
              return ListTile(
                title: Text(snapshot.data[index].player),
              );
            },
          );
        }
      },
    ),
  ),
);

}

【问题讨论】:

  • 等等,你的意思是AsyncSnapshot snapshot 为空?或snapshot.data?
  • 我的意思是 snapshot.data
  • 可能是因为:} else { return null; }?
  • 我试过了,结果一样
  • 那么您是否从_getBans() 方法返回非null 值?你确定吗?

标签: json listview flutter dart future


【解决方案1】:

请试试这个。我认为您必须使用 await 关键字作为 getLoggedToken 方法,return 将在返回任何内容之前等待帖子。但是现在你要在getLoggedToken完成他的工作之前回来。这就是为什么你总是收到 null。

 static Future _getBans() async {
 var token = await Storage.getLoggedToken();
      var body = {
        "token": token
      };
      final response = await http.post('${URLS.BASE_URL}/punishments.php', headers: ApiService.header, body: json.encode(body));
      if (response.statusCode == 200) {

    List<Ban> bans = [];
    var jsonData = json.decode(response.body)["bans"];
    for(var b in jsonData){
      Ban ban = Ban(b["player"], b["reason"], int.parse(b["end"]), b["by"]);
      bans.add(ban);
    }

    print(response.body);
    print(bans.length);

    return bans;
  } else {
    return null;
  }
}

【讨论】:

猜你喜欢
  • 2021-12-26
  • 2020-07-20
  • 1970-01-01
  • 2021-11-17
  • 2021-08-21
  • 2020-03-19
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多