Dart-Flutter问题:赋值后字段maleFirstName仍为null
问题分析:无法给MatchModel的fields子属性赋值
问题重现
实例化对象后尝试赋值:
MatchModel newMatchModel = MatchModel(); newMatchModel.fields?.maleFirstName =['33'];
执行后maleFirstName始终为null,无法设置预期值。
核心原因
fields初始为null:MatchModel的默认构造函数中,fields参数没有默认值,调用MatchModel()时fields会被初始化为null。- 空安全操作符跳过赋值:使用
?.操作符时,若左侧对象为null,右侧的赋值操作会直接被忽略,不会执行任何修改。
解决方案
方案1:实例化时初始化fields
在创建MatchModel对象时,直接传入一个Fields实例:
MatchModel newMatchModel = MatchModel(fields: Fields()); // 此时fields非null,可直接赋值(!操作符明确表示对象非空) newMatchModel.fields!.maleFirstName = ['33'];
方案2:修改MatchModel构造函数,给fields设置默认值
调整MatchModel的构造函数,让fields默认创建空实例:
class MatchModel { MatchModel({ this.id, this.createdTime, Fields? fields, }) : fields = fields ?? Fields(); // 新增默认初始化逻辑 String? id; DateTime? createdTime; Fields fields; // 改为非空类型,因为默认会初始化 // 其余方法保持不变... }
之后实例化时无需额外传参,直接赋值即可:
MatchModel newMatchModel = MatchModel(); newMatchModel.fields.maleFirstName = ['33'];
方案3:使用copyWith方法更新属性
利用模型类提供的copyWith方法,创建新对象并设置目标属性:
MatchModel newMatchModel = MatchModel(); // 直接创建新的Fields实例赋值 newMatchModel = newMatchModel.copyWith( fields: Fields(maleFirstName: ['33']) ); // 若需要保留原fields的其他属性,可嵌套使用copyWith newMatchModel = newMatchModel.copyWith( fields: newMatchModel.fields?.copyWith(maleFirstName: ['33']) ?? Fields(maleFirstName: ['33']) );
内容的提问来源于stack exchange,提问作者RJB
相关产品推荐
相关产品推荐

