RangeError(索引):无效值:有效值范围为空

时间:2019-07-23 07:39:33

标签: flutter dart

这是我如何声明我的列表

  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

2 个答案:

答案 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中计算距离,也可以将完整的计算数据传递给小部件。