【发布时间】: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 有效吗?