Flutter中展示MySQL存储时间相对时长?解决类型转换错误
解决Flutter中时间戳类型转换错误的方案
错误根源
PHP接口返回的发布时间戳(从MySQL获取的UNIX时间戳)是字符串格式,但Flutter代码中直接将其当作int类型处理,触发type 'String' is not a subtype of type 'int'类型不匹配错误。
具体修复步骤
1. 调整PHP接口返回格式(推荐)
确保PHP返回的时间戳为数字类型(而非字符串):
- 如果MySQL存储的是
datetime类型,转成UNIX时间戳时直接返回数字:// 正确写法:返回int类型时间戳 $data['publish_time'] = strtotime($row['publish_time']); - 避免使用
strval()等方法将时间戳转为字符串返回,否则会导致Flutter端类型不兼容。
2. Flutter端手动处理类型转换
如果PHP接口无法修改,在Flutter解析数据时强制将字符串转为int:
- 直接解析JSON时:
// 错误写法:直接赋值给int变量 // int publishTime = json['publish_time']; // 正确写法:先转字符串再解析为int int publishTime = int.parse(json['publish_time'].toString()); - 使用实体类(如json_serializable)时,在序列化方法中处理转换:
class Post { final int publishTime; Post({required this.publishTime}); factory Post.fromJson(Map<String, dynamic> json) { return Post( publishTime: int.parse(json['publish_time'].toString()), ); } }
3. 相对时间计算的适配
注意时间戳的单位(秒级/毫秒级):
- 若MySQL存的是秒级时间戳,需乘以1000转为Flutter兼容的毫秒级:
DateTime publishDateTime = DateTime.fromMillisecondsSinceEpoch(publishTime * 1000); Duration timeDiff = DateTime.now().difference(publishDateTime); // 计算相对时长示例 String getRelativeTime(Duration diff) { if (diff.inMinutes < 1) return '刚刚'; if (diff.inHours < 1) return '${diff.inMinutes}分钟前'; if (diff.inDays < 1) return '${diff.inHours}小时前'; return '${diff.inDays}天前'; }
4. 异常处理
添加解析失败的兜底逻辑,避免崩溃:
int? parsePublishTime(dynamic value) { try { return int.parse(value.toString()); } catch (e) { // 解析失败时返回当前时间戳(秒级) return DateTime.now().millisecondsSinceEpoch ~/ 1000; } }
内容的提问来源于stack exchange,提问作者M Al
相关产品推荐
相关产品推荐

