如何解决“ RangeError(索引):无效值:不在0..13范围内,包括14:”

时间:2019-10-25 18:15:06

标签: flutter dart

我有一个matches(50)列表,我需要从中提取一个FlSpot()值,该值需要一个XY作为parameter(doubles) ,但是,我的图形仅在X方向上接受10个值,因此,为了解决这个问题,我添加了一个for循环,该循环删除了多余的匹配项,并且仅返回10个匹配项,但是for循环引发错误。

我试图通过for循环进行调整,但无济于事。

    double calculateOneKDR(Matches match) {
    int totalKills = 0;
    int totalMatches = 0;

    totalKills += match.kills;
    totalMatches += match.matches;
    return num.parse((totalKills / totalMatches).toStringAsFixed(2));
  }

  List<FlSpot> calculateGraphDots(String playlist) {
    List<FlSpot> output = [];

    List<Matches> matches = _matches;
    List<Matches> validMatches = [];
    int extraLength = 0;

    matches.forEach(
      (match) {
        if (match.playlist == playlist) {
          validMatches.add(match);
        }
      },
    );
    if (validMatches.length > 10) {
      extraLength = validMatches.length - 10;
    }
    for (var i = 0; i < extraLength; i++) {
      validMatches.removeAt(i); //error point
    }
    List<double> matchkdrs = [];
    validMatches.forEach(
      (match) {
        matchkdrs.add(
          calculateOneKDR(match),
        );
      },
    );

    for (var i = 0; i < validMatches.length; i++) {
      output.add(
        FlSpot(
          double.parse('$i'),
          matchkdrs[i],
        ),
      );
    }
    return [...output];
  }

它应返回长度为10的List<FlSpot>,但有时会引发该错误,

E/flutter (15859): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: RangeError (index): Invalid value: Not in range 0..13, inclusive: 14
E/flutter (15859): #0      List.[]  (dart:core-patch/growable_array.dart:147:60)
E/flutter (15859): #1      List.removeAt  (dart:core-patch/growable_array.dart:28:22)
E/flutter (15859): #2      PlayerStats.getMaxY 
package:fortbuddy/providers/player_stats.dart:237
E/flutter (15859): #3      _ItemShopScreenState.initState.<anonymous closure> 
package:fortbuddy/screens/item_shop_screen.dart:33
E/flutter (15859): #4      new Future.delayed.<anonymous closure>  (dart:async/future.dart:316:39)
E/flutter (15859): #5      _rootRun  (dart:async/zone.dart:1120:38)
E/flutter (15859): #6      _CustomZone.run  (dart:async/zone.dart:1021:19)
E/flutter (15859): #7      _CustomZone.runGuarded  (dart:async/zone.dart:923:7)```

2 个答案:

答案 0 :(得分:0)

每次删除removeAt(i)时,向量的其余部分都会向上移动,因此现在更短了。
因此,一段时间后,删除操作将结束。

您需要每次都删除相同的索引,或者从后部开始-或使用不同于每次删除一个索引并每次向上移动其余索引的方法,这效率很低。阅读erase

答案 1 :(得分:0)

您可以使用sublist方法。 https://api.dartlang.org/stable/2.6.0/dart-core/List/sublist.html

因此,您可以这样编写if语句

if (validMatches.length > 10) {
     validMatches = validMatches.sublist(0, 10);
}    

并且您不再需要