RangeError问题求助:TUindex无法接收大于9的数值
RangeError问题求助:TUindex无法接收大于9的数值
大家好,我最近在开发Flutter项目时遇到了一个头疼的RangeError问题,折腾了好久都没解决,想请各位大佬帮忙看看。
我做了一个横向滚动的ListView,用来展示1到15的条目,但不管怎么调整类型(试过int、double、String),只要TUindex的数值超过9,就会触发RangeError,完全没法正常加载10到15的条目。我已经按照其他帖子的建议设置了itemCount: TU.length,但问题依然存在。
以下是我的代码片段:
变量定义
// 变量定义 int CurrentTU = 1; List TU = <int>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
ListView构造器
// ListView构造器 ListView.builder( scrollDirection: Axis.horizontal, itemCount: TU.length, shrinkWrap: true, physics: const ScrollPhysics(), itemBuilder: (context, index) { return TUEntry( TUindex: TU[index], ); }, ),
TUEntry组件
// TUEntry组件 class TUEntry extends StatelessWidget { const TUEntry({super.key, required this.TUindex}); final int TUvalue = 10; final int TUindex; @override Widget build(BuildContext context) { return Container( height: 40, width: 40, color: Colors.grey, child: Column(children: [ if (Events1.elementAt(TUindex) == 'N') const Icon(Icons.add, color: Colors.grey,) else FIcon(ftr: Events1.elementAt(TUindex)), if (Events2.elementAt(TUindex) == 'N') const Icon(Icons.add, color: Colors.grey,) else FIcon(ftr: Events2.elementAt(TUindex)), if (Events3.elementAt(TUindex) == 'N') const Icon(Icons.add, color: Colors.grey,) else FIcon(ftr: Events3.elementAt(TUindex)), if (TUindex == CurrentTU) const Icon(Icons.gps_fixed) else const Icon(Icons.gps_not_fixed), if (TUindex == CurrentTU) const Icon(Icons.arrow_upward_rounded) else Container(child: Text('-- $TUindex --'),), ]), ); } }
我试过把TU列表改成double或者String类型,但问题完全没变化,还是只能加载0-9的数值。有没有人能帮我分析下问题出在哪?
可能的问题分析与解决方案
仔细看代码后,我怀疑问题出在Events1、Events2、Events3这三个列表上:
- 你用
TUindex作为索引去访问这三个列表,但TUindex的取值是1-15,而如果这三个列表的长度只有10(索引范围0-9),那当TUindex等于10时,就会超出列表的最大索引,直接触发RangeError。 - 另外,Flutter中列表的索引是0-based(从0开始),但你的
TU列表是1-based(从1开始),这大概率是索引基数搞混了导致的问题。
给你两个可行的解决方案:
- 调整事件列表的长度:确保
Events1、Events2、Events3的长度至少为15,和TU列表的长度对应,这样1-15的索引都能找到对应的元素。 - 修正索引计算方式:如果事件列表的长度是10,且你本来想让
TUindex对应事件列表的位置,那把事件列表的访问代码改成Events1.elementAt(TUindex - 1),把1-based的TUindex转换成0-based的索引。比如:
// 修正后的示例代码 if (Events1.elementAt(TUindex - 1) == 'N') const Icon(Icons.add, color: Colors.grey,) else FIcon(ftr: Events1.elementAt(TUindex - 1)),
这样当TUindex是10时,就会取Events1的第9个元素(0-based索引),不会再超出范围了。
备注:内容来源于stack exchange,提问作者David Asher
相关产品推荐
相关产品推荐

