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

跟随Flutter Firebase教程写Dart代码时出现Object未定义[]操作符错误

问题根源

你遇到的报错是因为当前使用的cloud_firestore依赖版本高于教程使用的版本,2.0.0及以上版本的cloud_firestore有两个不兼容的API变更:

  • DocumentSnapshot的data从属性调整为方法,需要通过data()调用才能获取文档数据
  • 引入了空安全校验,data()方法默认返回Map<String, dynamic>?类型,需要显式做类型转换

修复代码

直接修正你的转换方法即可,和age字段为int类型无关:

List<Sport> _sportListFromSnapshot(QuerySnapshot snapshot){
  return snapshot.docs.map((doc){
    // 先调用data()方法获取文档数据,再转换为Map类型
    final data = doc.data() as Map<String, dynamic>;
    return Sport(
       name: data['name'] as String? ?? '',
       sport: data['sport'] as String? ?? '',
       // 显式声明类型,避免隐式转换的编译警告
       age: data['age'] as int? ?? 0
    );
  }).toList();
}

可选优化方案

你可以在定义集合引用时直接绑定类型转换,后续读取数据时无需手动转换,代码更简洁:

// 定义集合引用时绑定Sport类型的序列化/反序列化逻辑
final sportCollection = FirebaseFirestore.instance
    .collection('你的集合名')
    .withConverter<Sport>(
      fromFirestore: (snap, _) {
        final data = snap.data()!;
        return Sport(
          name: data['name'] ?? '',
          sport: data['sport'] ?? '',
          age: data['age'] ?? 0,
        );
      },
      toFirestore: (sport, _) => {
        'name': sport.name,
        'sport': sport.sport,
        'age': sport.age,
      },
    );

// 后续直接获取Sport类型的列表,无需手动转换
Stream<List<Sport>> getSportList() {
  return sportCollection.snapshots().map(
        (snap) => snap.docs.map((doc) => doc.data()).toList(),
      );
}

内容的提问来源于stack exchange,提问作者Something You

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:54:05