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

颤振:RangeError(索引):无效值:不在包含范围内0..27:28

Flutter:RangeError(索引):无效值:不在0..14范围内,包括:15