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

Flutter非空字段paidLeaveTypeName未初始化问题求助

问题

已解决Flutter空安全问题,但遇到模型初始化错误,提示:

Non-nullable instance field 'paidLeaveTypeName' must be initialized. Try adding an initializer expression

模型代码片段

LeaveListResponse({
    this.total,
    this.result,
  });

  LeaveListResponse.fromJson(Map<String, dynamic> json) {
    total = json['total'] as int?;
    result = (json['result'] as List?)
        ?.map((dynamic e) =>
            LeaveListResponse.fromJson(e as Map<String, dynamic>))
        .toList();
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> json = <String, dynamic>{};
    json['total'] = total;
    json['result'] = result?.map((e) => e.toJson()).toList();
    return json;
  }
}

class LeaveListResult {
  int? paidLeaveId;
  String? paidLeaveUuid;
  String? paidLeaveEmployeeUuid;
  String? paidLeaveEmployeeNip;
  String? paidLeaveEmployeeFullName;
  String? paidLeaveTypeUuid;
  String paidLeaveTypeName; // 推测此处你已去掉?,标记为非空字段
  String? paidLeaveTypeDetailUuid;
  String? hirarki;
  int? levels;
  int? jumlahHari;

调用代码

LeaveListModel responses =
    snapshot.data!.data as LeaveListModel;
return Text(responses.response?.paidLeaveTypeName?? "");
解决方案

错误核心是非空类型字段必须在实例创建时完成初始化,以下是几种可行的处理方案:


方案1:将字段设为可空类型

如果paidLeaveTypeName允许为空,直接在字段声明时保留?标记为可空类型,无需强制初始化:

class LeaveListResult {
  // ...其他字段
  String? paidLeaveTypeName; // 保留?,表示字段可为null
  // ...其他字段
}

此方式匹配你最初的代码结构,若仍报错,检查是否误删了字段后的?。


方案2:使用late延迟初始化

如果确定paidLeaveTypeName会在使用前通过JSON解析赋值,可使用late修饰符标记延迟初始化:

class LeaveListResult {
  // ...其他字段
  late String paidLeaveTypeName; // 承诺后续会完成初始化
  // ...其他字段

  // 补充LeaveListResult的JSON解析构造函数(你当前代码缺失此逻辑)
  LeaveListResult.fromJson(Map<String, dynamic> json) {
    paidLeaveTypeName = json['paidLeaveTypeName'] as String? ?? "";
    // 其他字段解析逻辑
    paidLeaveId = json['paidLeaveId'] as int?;
    paidLeaveUuid = json['paidLeaveUuid'] as String?;
    // ...
  }
}

注意:必须保证在使用paidLeaveTypeName前完成赋值,否则会触发运行时错误。


方案3:初始化默认值

若希望字段始终非空,可直接在声明时设置默认值,或在构造函数初始化列表中定义:

// 子方案3.1:直接声明默认值
class LeaveListResult {
  // ...其他字段
  String paidLeaveTypeName = ""; // 初始化为空字符串
  // ...其他字段
}

// 子方案3.2:构造函数初始化列表
class LeaveListResult {
  String paidLeaveTypeName;
  // ...其他字段

  // 带默认值的构造函数
  LeaveListResult({this.paidLeaveTypeName = ""});

  // JSON解析构造函数
  LeaveListResult.fromJson(Map<String, dynamic> json) :
    paidLeaveTypeName = json['paidLeaveTypeName'] as String? ?? "",
    paidLeaveId = json['paidLeaveId'] as int? {
    // 其余字段赋值逻辑
  }
}

额外修正点

  1. 你当前LeaveListResponse.fromJson中解析result的逻辑错误,应映射为LeaveListResult.fromJson而非自身的构造函数,否则会导致类型不匹配:
result = (json['result'] as List?)
    ?.map((dynamic e) =>
        LeaveListResult.fromJson(e as Map<String, dynamic>)) // 修正为LeaveListResult
    .toList();
  1. LeaveListResult类缺少完整的fromJson和toJson方法,需补充以实现正确的JSON解析与序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:05:46