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

