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

Flutter读取Firebase数据报错:type null is not a subtype of type 'String'

问题解决:读取Firebase数据时抛出「type null is not a subtype of type 'String'」错误

错误原因

报错核心是Firebase的users集合中存在部分文档缺少bmi字段,或bmi字段值为null,而你的User类中bmi是必填的非空double类型,当json['bmi']返回null时,无法直接赋值给非空double,引发类型转换错误,最终导致StreamBuilder进入错误分支。

额外需要确认:Firebase中bmi字段的类型是否为数字(int/double),以及字段名是否和代码中的bmi完全一致(大小写敏感)。

解决方案

根据需求可选择以下修复方式:

1. 给bmi设置默认值,兼容null情况

修改User类的fromJson方法,处理null和Firestore中数字可能为int的情况:

class User {
  final double bmi;

  User({required this.bmi});

  Map<String, dynamic> toJson() => {
        'bmi': bmi,
      };

  static User fromJson(Map<String, dynamic> json) => User(
        // 若json['bmi']为null或int类型,转为double并设置默认值0.0
        bmi: (json['bmi'] as num?)?.toDouble() ?? 0.0,
      );
}

2. 将bmi改为可空类型,UI中处理空值显示

如果允许bmi为空,修改字段为可空类型,同时在UI组件中处理空值:

class User {
  final double? bmi;

  User({this.bmi});

  Map<String, dynamic> toJson() => {
        'bmi': bmi,
      };

  static User fromJson(Map<String, dynamic> json) => User(
        bmi: json['bmi'] as double?,
      );
}

修改buildUser组件:

Widget buildUser(User user) => ListTile(leading: Text(user.bmi?.toString() ?? '无数据'));

3. 过滤无效文档,只读取含有效bmi的文档

修改readUsers方法,先过滤掉缺少bmi或bmi为null的文档:

Stream<List<User>> readUsers() => FirebaseFirestore.instance
  .collection('users')
  .snapshots()
  .map((snapshot) => snapshot.docs
      .where((doc) => doc.data().containsKey('bmi') && doc['bmi'] != null)
      .map((doc) => User.fromJson(doc.data()))
      .toList());

4. 检查Firebase数据完整性

登录Firebase控制台,查看users集合下的所有文档,确保每个文档都包含bmi字段且值为非空数字,存在问题的文档直接在控制台修正。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:15:40