RangeError(索引):无效值:有效值范围为空
Posted
技术标签:
【中文标题】RangeError(索引):无效值:有效值范围为空【英文标题】:RangeError (index): Invalid value: Valid value range is empty 【发布时间】:2019-12-01 04:45:07 【问题描述】:这就是我声明我的清单的方式
List<String> distance = [];
这是我的 ListView 构建器
return ListView.builder(
itemCount: widget.stores.length,
shrinkWrap: true,
scrollDirection: Axis.vertical,
itemBuilder: (BuildContext context, int index)
if (widget.latitude == 0.0)
else
calculateDistance(widget.stores[index].storeLatitude,
widget.stores[index].storeLongitude, index);
return GestureDetector(
child: Card(
child: Container(
width: MediaQuery.of(context).size.width * 0.50,
child: ListTile(
title: Text(
widget.stores[index].storeName,
style: TextStyle(fontSize: 18),
),
subtitle: Text(
widget.stores[index].storeAddress,
),
trailing: (distance[index].isEmpty) ? Text("") : Text(distance[index]),
),
),
),
);
);
我在setState()
中添加distance
这里是为distance
增值的函数
calculateDistance(widget.stores[index].storeLatitude,
widget.stores[index].storeLongitude, index);
-------------
Future calculateDistance(String storeLatitude, String storeLongitude) async
final list = (await Geolocator().distanceBetween(widget.latitude, widget.longitude,double.parse(storeLatitude), double.parse(storeLongitude)));
if (list != null)
setState(()
distance.add((list / 1000).toStringAsFixed(1));
);
所以当它为空时,它会抛出这个错误
I/flutter (22854): 另一个异常被抛出: RangeError (index): 无效值:有效值范围为空:0 I/flutter (22854): 另一个异常被抛出: RangeError (index): Invalid value: Valid 取值范围为空:1
我该如何解决?
这是我的完整脚本https://gist.github.com/bobykurniawan11/ef711e5121be303e8102a6ab4871435f
【问题讨论】:
widget.stores 和 distance 必须始终是相同的大小,如果 calculateDistance 有一个空列表,则该值不会添加到距离数组中,因此 widget.stores 可能有超过 distance 并且它将碰撞。尾随:(距离[索引].isEmpty)? Text("") : Text(distance[index]),应该类似于 distance.length > index 吗?文本(距离[索引]):文本('') 但是你的逻辑是有缺陷的,例如假设我有值 A、B、C(即长度 3)的 widget.stores,然后计算 A 和 C 而不是 B 的距离(即距离长度2)。然后它会崩溃,如果你添加我上面建议的代码,它不会崩溃。但是 B 在位置距离 [1] 将具有 C 的距离值,并且将具有距离值 distance[2] = index out of bounds。 (范围误差) @Jason 距离一开始是空的。我只想把calculateDistance的结果放到它上面 在initState中将距离设置为与widget.stores相同的大小,将每个值初始化为空字符串。然后根据需要通过设置数组中的值来填充距离。您的代码还有更多问题,例如在绘制屏幕时设置状态并触发异步方法。但这是另一个问题。 @MyNamels 有效吗? 【参考方案1】:商店是空的
使用初始化状态。 initState 调用存储数据读取方法
【讨论】:
喜欢void initState() distance = [];
?,如果是这样,我已经这样做了
例如code
@override void initState() super.initState(); // 应用初始化时调用getJSONData()方法 this.getJSONData(); this.getJSONData() 是获取数组方法
好吧,距离是某些函数的结果。所以它在开始时为空/空【参考方案2】:
@MyNamels,请尝试以下操作:
使用状态完整的widget,在 initState 中,将距离初始化为与您的 widget.store 相同的大小。即
@override
initState()
super.initState();
if (widget.store != null)
widget.store.forEach((f) => distance.add(''));
然后在你的calculateDistance中设置那个位置的值,即
setState(()
distance[index] = (list / 1000).toStringAsFixed(1);
);
上面的代码应该可以工作,并且不会导致 RangeError(index)
但是,在构建过程中调用 calculateDistance 是不正确的,因为小部件可能会被重绘很多次,并且每次重绘都会调用 calculateDistance。每个设置状态都会导致构建再次触发,您可以通过在计算距离中添加打印来检查这一点,构建将重新触发计算距离,从而形成无限循环。而是在 initState 中计算距离或将完整的计算数据传递给小部件。
【讨论】:
以上是关于RangeError(索引):无效值:有效值范围为空的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:DioError [DioErrorType.DEFAULT]:RangeError(索引):无效值:只有有效值为0:
RangeError(索引):无效值:不在 0..7 范围内,包括:8
RangeError(索引):无效值:不在 0..6 范围内,包括:-2
颤振错误:RangeError(索引):无效值:不在0..2范围内,包括:3