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? { // 其余字段赋值逻辑 } }
额外修正点
- 你当前
LeaveListResponse.fromJson中解析result的逻辑错误,应映射为LeaveListResult.fromJson而非自身的构造函数,否则会导致类型不匹配:
result = (json['result'] as List?) ?.map((dynamic e) => LeaveListResult.fromJson(e as Map<String, dynamic>)) // 修正为LeaveListResult .toList();
LeaveListResult类缺少完整的fromJson和toJson方法,需补充以实现正确的JSON解析与序列化。
内容的提问来源于stack exchange,提问作者1988
相关产品推荐
相关产品推荐

