You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:21:18