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
相关产品推荐
相关产品推荐

