You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter拉取Firebase实时数据库数据报错:期望int类型却得到String,ListView无数据

问题根因与修复方案

1. 列表长度为0的核心原因

你从接口拿到的JSON本身就是单条Result对应的数据结构,不需要遍历外层map的键值对。你现在写的map.forEach是把当前JSON的每一个字段(比如Name/Percent)作为循环的key,字段值作为value,循环里取value['Name']根本不存在,执行直接抛出异常,所以不会有数据添加到列表,列表长度自然为0。

2. 类型报错的核心原因

你构造Model的时候试图从choice数组的元素里取e['index'],但你返回的choice数组里全是字符串值("Correct"等),不是对象,不存在index属性,所以触发了期望int类型但拿到String的报错。另外你返回的question数组元素里也没有index字段,要取索引需要自己遍历计数。

修正后的代码

Future<void> getList() async {
  list.clear();
  final url = Uri.parse(
      'https://testisnotesttheisthelearningapp-default-rtdb.firebaseio.com/Schools/${widget.uid}/ResultsFolder/${widget.id}.json');
  final response = await get(url);
  print(response.body);
  var map = json.decode(response.body) as Map<String, dynamic>;
  if (map != null) {
    // 直接构造Result对象,不需要遍历map
    var temp = Result(
        // 加类型转换兜底,避免Firebase返回字符串类型的数字
        int.parse(map['Percent'].toString()),
        // choice数组自己生成索引,不要试图从字符串元素里取index
        (map['choice'] as List<dynamic>)
            .asMap()
            .entries
            .map((entry) => Model(entry.key, map['question'][entry.key]['question'], []))
            .toList(),
        int.parse(map['Score'].toString()),
        (map['question'] as List<dynamic>).map((e) => e).toList(),
        map['Name']);
    list.add(temp);
    // 若需要更新UI,这里补充setState调用
    setState(() {});
  }
}

额外注意点

  • 如果你的Result类的Percent/Score字段定义为int类型,一定要做上述的类型转换兜底,避免Firebase存储时误存为字符串导致的类型报错
  • 确保调用getList后有触发状态更新,否则就算列表有数据,ListView也不会自动刷新

内容的提问来源于stack exchange,提问作者Anonymous Trap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:15:03