这是我如何声明我的列表
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]),
),
),
),
);
});
我正在distance
内添加setState()
这是为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(索引): 无效值:有效值范围为空:0 I / flutter(22854): 引发了另一个异常:RangeError(索引):无效值:有效 值范围为空:1
我该如何解决?
这是我的完整脚本https://gist.github.com/bobykurniawan11/ef711e5121be303e8102a6ab4871435f
答案 0 :(得分:0)
商店为空
使用initState。 initState调用存储数据读取方法
答案 1 :(得分:0)
@MyNamels,请尝试以下操作:
在initState中使用全状态widget,将初始化距离设置为与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中计算距离,也可以将完整的计算数据传递给小部件。