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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:32:25