颤振:索引超出范围

时间:2021-02-17 19:39:05

标签: flutter dart

我正在尝试添加动态滑块。我尝试了不同的方法来实现我想要创建的这张幻灯片。当我尝试使用该代码时,出现错误: RangeError(索引):索引超出范围:索引应该小于75:75。我不知道为什么。但是当我将 category[count] 更改为 category[i] 时,错误消失了,但重复了相同的值。

  Widget build(BuildContext context) {
    final List<Category> category = widget.category;
    int slideLenght = ((category.length / 14).floor()) + 1;
    List<Widget> slides = [];
    List categoryForSlide = [];
    var count = 0;
    for (var i = 0; i < slideLenght; i++) {
      List<Category> subCat = List();

      for (var i = 0; i < category.length; i++) {
        if (i == 14) break;
        subCat.add(category[count]);
        print(count);
        count++;
      }
      categoryForSlide.add(subCat);
    }
    print(categoryForSlide.length);
    return Container(),
    );

2 个答案:

答案 0 :(得分:2)

我认为您只需将 count 重置为 0 或在外循环中定义它:

Widget build(BuildContext context) {
    final List<Category> category = widget.category;
    int slideLenght = ((category.length / 14).floor()) + 1;
    List<Widget> slides = [];
    List categoryForSlide = [];
    for (var i = 0; i < slideLenght; i++) {
      var count = 0;
      List<Category> subCat = List();

      for (var i = 0; i < category.length; i++) {
        if (i == 14) break;
        subCat.add(category[count]);
        print(count);
        count++;
      }
      categoryForSlide.add(subCat);
    }
    print(categoryForSlide.length);
    return Container();
};

同样,正如评论中 Ουιλιαμ Αρκευα 所指出的那样,为两个嵌套循环使用相同的 i 变量名称并不是一个好习惯。

所以简化版本是:

Widget build(BuildContext context) {
    final List<Category> category = widget.category;
    int slideLenght = ((category.length / 14).floor()) + 1;
    List<Widget> slides = [];
    List categoryForSlide = [];
    for (var i = 0; i < slideLenght; i++) {
      List<Category> subCat = List();

      for (var j = 0; j < category.length; j++) {
        if (j == 14) break;
        subCat.add(category[j]);
        print(j);
      }
      categoryForSlide.add(subCat);
    }
    print(categoryForSlide.length);
    return Container();
};

编辑:好的,据我所知,您希望每张幻灯片显示 14 个类别,您应该在问题中提到这一点。

您发布的解决方案有效,但不是最佳 IMO,您可以使用模运算符更简单。

看这个例子,它为每张幻灯片添加了 3 个类别:

void main() {
  final List<String> categories = List<String>.generate(10, (counter) => "Category $counter");
  final int nbCategoriesPerPage = 3;
  List<List<String>> slides = [[]];

  int slideIndex = 0;
  for (var i = 0; i < categories.length; i++) {
    if (i != 0 && i % nbCategoriesPerPage == 0) {
      slides.add(List());
      slideIndex++;
    }
    slides[slideIndex].add(categories[i]);
  }

  print(slides);
}

输出:

<块引用>

[[0 类,1 类,2 类],[3 类,4 类, 第 5 类]、[第 6 类、第 7 类、第 8 类]、[第 9 类]]

希望有帮助。

答案 1 :(得分:0)

解决我的代码

Widget build(BuildContext context) {
final List<Category> category = widget.category;
int slideLenght = ((category.length / 14).floor()) + 1;
List<Widget> slides = [];
List categoryForSlide = [];
var count = 0;
var f = 0;
for (var i = 0; i < slideLenght; i++) {
  List<Category> subCat = List();
  for (var z = 0; z < category.length; z++) {
    if (count < category.length) {
      count++;
    }
    subCat.add(category[count - 1]);
    if (count == category.length) break;
    if (z == 14) break;
  }

  categoryForSlide.add(subCat);
}
    print(categoryForSlide.length);
    return Container();
}