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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:54:03