Flutter对接Firebase时报Null类型不是String类型子类型问题求助
错误定位与修复方案
核心问题1:字段拼写错误
你在TataUsahaModel的fromJson工厂方法中,将quotes字段拼写为qoutes,导致从Firebase读取对应字段时无法匹配,返回null值,而模型定义该字段为非空String类型,因此抛出type 'Null' is not a subtype of type 'String'错误。
核心问题2:泛型定义错误
代码中多处将Map泛型写为Map<"String", dynamic>,String作为类型参数不需要加引号,错误的泛型写法也可能触发类型转换异常。
核心问题3:无空值兜底逻辑
即使字段拼写正确,若Firebase中某条数据缺失对应字段,依然会返回null触发错误,需要为空值配置默认兜底值。
修复后的代码
1. 修正tata_usaha_model.dart
import 'package:equatable/equatable.dart'; class TataUsahaModel extends Equatable { final String id; final String name; final String tahunMasuk; final String posisi; final String quotes; final String imageUrl; TataUsahaModel({ required this.id, this.name = '', this.tahunMasuk = '', this.posisi = '', this.quotes = '', this.imageUrl = '', }); factory TataUsahaModel.fromJson(String id, Map<String, dynamic> json) => TataUsahaModel( id: id, name: json['name'] ?? '', tahunMasuk: json['tahunMasuk'] ?? '', posisi: json['posisi'] ?? '', quotes: json['quotes'] ?? '', // 修正拼写错误,添加空值兜底 imageUrl: json['imageUrl'] ?? '', ); Map<String, dynamic> toJson() => { // 修正泛型写法 'id': id, 'name': name, 'tahunMasuk': tahunMasuk, 'posisi': posisi, 'quotes': quotes, 'imageUrl': imageUrl, }; @override List<Object?> get props => [ id, name, tahunMasuk, posisi, quotes, imageUrl, ]; }
2. 修正tata_usaha_service.dart的类型转换
class TataUsahaService { CollectionReference _tatausahaRef = FirebaseFirestore.instance.collection('tatausaha'); Future<List<TataUsahaModel>> fetchTataUsaha() async { try { QuerySnapshot result = await _tatausahaRef.get(); List<TataUsahaModel> tatausaha = result.docs.map((e) { // 修正泛型写法 return TataUsahaModel.fromJson(e.id, e.data() as Map<String, dynamic>); }).toList(); print(tatausaha); return tatausaha; } catch (e) { throw e; } } }
修改完成后重新运行即可解决该错误。
内容的提问来源于stack exchange,提问作者muhammad alam nur haris
相关产品推荐
相关产品推荐

