Flutter中'int'与'String?'类型不匹配及点赞状态判断问题求助
问题分析与解决方案
1. 类型不匹配异常:type 'int' is not a subtype of type 'String?'
原因
你遇到的这个异常核心是后端返回的数据类型不一致:虽然Postman显示的是字符串格式的"0",但实际加载部分帖子时,后端返回的like_status或saved_post_status是整数类型的0/1,而你的Model里把这两个字段定义成了String?,序列化时就会出现类型不兼容的问题。
解决办法
有两种常用的处理方式,选适合你的场景:
方式一:统一Model字段类型为
int?
既然后端返回的本质是状态标识(0/1),用整数类型更贴合语义,修改Model定义:int? likeStatusmodel; int? savedPostStatus;如果后端偶尔会返回字符串格式的数字,可以搭配序列化转换逻辑兼容(以
json_serializable为例):int? _stringOrIntToInt(dynamic value) { if (value is String) { return int.tryParse(value); } else if (value is int) { return value; } return null; } @JsonKey(fromJson: _stringOrIntToInt) int? likeStatusmodel; @JsonKey(fromJson: _stringOrIntToInt) int? savedPostStatus;方式二:保持
String?类型,添加类型转换逻辑
如果一定要用字符串类型,需要在序列化时把整数转成字符串:String? _stringOrIntToString(dynamic value) { if (value is int) { return value.toString(); } else if (value is String) { return value; } return null; } @JsonKey(fromJson: _stringOrIntToString) String? likeStatusmodel; @JsonKey(fromJson: _stringOrIntToString) String? savedPostStatus;
2. 字符串与整数的条件判断问题
原因
当你用String类型的字段和整数0比较时(==0),Dart会提示类型不相关的警告——因为String和int是完全不同的类型,直接用==比较永远不会相等,所以判断不生效。而用=='0'的前提是字段的值确实是字符串格式的"0",如果后端返回的是整数0,这个判断也会不成立。
解决办法
根据你最终选择的字段类型来处理:
如果字段是
int?类型
直接用整数比较,逻辑清晰且无警告:child: SvgPicture.asset( color: (singleUserPost.postLikeCount == 0) ? Colors.black : Colors.red, fit: BoxFit.cover, width: 20, "assets/images/like.svg" ),如果字段是
String?类型
推荐先转成整数再判断(更鲁棒,兼容后端返回整数或字符串的情况):child: SvgPicture.asset( color: (int.parse(singleUserPost.postLikeCount ?? '0') == 0) ? Colors.black : Colors.red, fit: BoxFit.cover, width: 20, "assets/images/like.svg" ),也可以直接比较字符串(需保证后端返回的都是字符串
"0"/"1"):child: SvgPicture.asset( color: (singleUserPost.postLikeCount == '0') ? Colors.black : Colors.red, fit: BoxFit.cover, width: 20, "assets/images/like.svg" ),注意:使用
int.parse时最好加空值处理(比如?? '0'),避免字段为null时抛出异常。
内容的提问来源于stack exchange,提问作者Diljith
相关产品推荐
相关产品推荐

