Flutter使用三元运算符判断int值报错Null不是int子类型
错误原因
报错的本质是运行时feedElement.cntComments实际值为null,不符合你声明的非空int类型要求:
- 你在
FeedModel中给cntComments定义为非空int、构造函数加了required修饰,这层约束仅在手动调用构造函数显式传参时生效。 - 90%以上的同类问题出在JSON反序列化环节:如果FeedModel是从接口返回的JSON数据转换生成,当接口返回的
cntComments字段缺失、值为null时,若反序列化代码直接写cntComments: json['cntComments']赋值,在Dart空安全弱校验配置下,null会被直接塞入非空int字段。等到执行>0的比较逻辑时,int类型的比较运算符无法处理null操作数,就会抛出这个类型错误。
修复方法
1. 从数据模型层兜底,彻底杜绝null值
给所有可能由接口/动态数据源赋值的字段加默认值,反序列化时统一处理null场景:
class FeedModel { String avatar; String account; String accountName; String message; bool verified; String timeAgo; int cntComments; int cntLikes; int cntShares; FeedModel({ required this.avatar, required this.account, required this.accountName, required this.message, required this.verified, required this.timeAgo, // 统计类字段默认值设为0,传参为null时自动兜底 this.cntComments = 0, this.cntLikes = 0, this.cntShares = 0, }); // 如果你实现了fromJson方法,必须对每个字段做null判断兜底 factory FeedModel.fromJson(Map<String, dynamic> json) { return FeedModel( avatar: json['avatar'] as String? ?? '', account: json['account'] as String? ?? '', accountName: json['accountName'] as String? ?? '', message: json['message'] as String? ?? '', verified: json['verified'] as bool? ?? false, timeAgo: json['timeAgo'] as String? ?? '', cntComments: json['cntComments'] as int? ?? 0, cntLikes: json['cntLikes'] as int? ?? 0, cntShares: json['cntShares'] as int? ?? 0, ); } }
2. UI层加空判断兜底(可选,双重防护)
如果存在多数据源构造FeedModel的场景,可以在三元判断前加空值兜底,避免极端情况UI崩溃:
// 用??运算符给null场景默认赋值0 ((feedElement.cntComments ?? 0) > 0) ? Text( (feedElement.cntComments ?? 0).toString(), style: const TextStyle(color: Colors.grey), ) : Text( 'Comments', style: const TextStyle(color: Colors.grey), ),
注:两处Text的样式完全一致,可以抽成公共样式常量减少重复代码,该优化不影响报错修复。
内容的提问来源于stack exchange,提问作者Art Noimann
相关产品推荐
相关产品推荐

