如何在Flutter中从Firebase实时数据库获取Year对象列表
读取Firebase实时数据库年份列表的正确方法
你的Firebase实时数据库中存储着包含id和year属性的Year对象列表,且已定义好对应的YearModel模型,但之前的两种读取方式存在类型转换错误,以下是正确的实现方案:
先补充YearModel的toString方法(可选,方便调试)
为了更直观打印模型数据,建议给YearModel添加toString方法:
class YearModel { int? id; String? year; YearModel({ this.id, this.year, }); factory YearModel.fromMap(Map<dynamic, dynamic> map) { return YearModel( id: map['id'] as int?, year: map['year'] as String?, ); } // 添加toString方便调试 @override String toString() { return 'YearModel{id: $id, year: $year}'; } }
方法1:实时监听数据变化(适合需要实时同步的场景)
await Firebase.initializeApp(); final yearsRef = FirebaseDatabase.instance.ref('years'); yearsRef.onValue.listen((event) { final List<YearModel> tempYears = []; // 清空原有列表,避免重复累加 years?.clear(); // 遍历所有子节点快照 for (final childSnapshot in event.snapshot.children) { // 将子节点的value转为Map,再通过fromMap生成模型实例 final yearData = childSnapshot.value as Map<dynamic, dynamic>; final yearModel = YearModel.fromMap(yearData); tempYears.add(yearModel); log(yearModel.toString()); } // 将新数据添加到目标列表 years?.addAll(tempYears); }, onError: (error) { log('读取数据失败:$error'); });
方法2:一次性异步获取数据(适合只需要加载一次的场景)
await Firebase.initializeApp(); final snapshot = await FirebaseDatabase.instance.ref('years').get(); if (snapshot.exists) { final List<YearModel> tempYears = []; // 遍历所有子节点 for (final childSnapshot in snapshot.children) { final yearData = childSnapshot.value as Map<dynamic, dynamic>; final yearModel = YearModel.fromMap(yearData); tempYears.add(yearModel); } // 赋值给你的years列表 years = tempYears; } else { log('数据库中不存在years节点'); }
之前代码的错误原因
- 第一种尝试:直接将子节点快照
child强制转换为YearModel,快照对象和模型类类型不匹配,必须先获取快照的value转为Map,再通过fromMap方法创建实例。 - 第二种尝试:将
snapshot直接强制转换为HashMap,快照本身不是Map类型,需要通过snapshot.value获取节点数据,再遍历子节点逐个处理。
内容的提问来源于stack exchange,提问作者Ahmed El Sayed
相关产品推荐
相关产品推荐

