Flutter更新数据返回列表页substring触发RangeError解决方案
问题原因
报错确实由substring调用逻辑不严谨导致。
你在标题截断逻辑中写了判断:当标题长度大于15时,直接截取前18位字符加省略号。但如果更新条目后返回的某条公告标题长度在16~17之间——也就是满足「长度大于15」的条件,但实际总长度不到18——此时调用substring(0,18)会尝试访问超出字符串实际长度的索引,就会抛出你看到的RangeError (end): Invalid value: Not in inclusive range 0..17: 18错误。
你写的正文截断逻辑虽然暂时没触发报错,但存在完全相同的隐患。
修复方案
所有字符串截断操作前,不要硬编码结束索引,要先判断字符串实际长度,取「预设截断长度」和「字符串实际长度」中更小的值作为截取终点,避免越界。
- 替换原有标题显示代码:
// 原错误代码 announcementlist.title.length > 15 ? '${announcementlist.title.substring (0,18)} ...' : announcementlist.title, // 修复后代码 announcementlist.title.length > 18 ? '${announcementlist.title.substring(0, 18)} ...' : announcementlist.title,
这里顺便修正了判断逻辑:只有长度超过要截断的18位时才触发截断,长度15~17的标题直接显示完整内容即可,不需要加省略号,交互逻辑更合理。
- 替换原有正文显示代码,消除同类隐患:
// 原有代码 announcementlist.content.length > 20 ? '${announcementlist.content.substring (0,20)} ... ' : announcementlist.content // 修复后代码 announcementlist.content.length > 20 ? '${announcementlist.content.substring(0, 20)} ... ' : announcementlist.content
如果项目里有多处字符串截断需求,可以抽一个通用工具方法减少重复代码:
String truncateText(String rawText, int maxShowLength) { if (rawText.length <= maxShowLength) return rawText; return '${rawText.substring(0, maxShowLength)}...'; }
使用时直接传入字符串和最大显示长度即可,比如truncateText(announcementlist.title, 18),不需要每次重复写长度判断。
内容的提问来源于stack exchange,提问作者Kinesis
相关产品推荐
相关产品推荐

