首页 > 解决方案 > 颤振范围错误 ListView 的无效值,而不是 Builder

问题描述

错误: RangeError (index): Invalid value: Valid value range is empty: 0

相关的导致错误的小部件是

主菜单

lib\main.dart:659

抛出异常时,这是堆栈

#0 List._setIndexed (dart:core-patch/growable_array.dart:262:73)

#1 List.[]= (dart:core-patch/growable_array.dart:258:5)

#2 获取菜单数组

包:j_deli/menu/menu_main.dart:92

#3 创建菜单列表

包:j_deli/menu/menu_main.dart:67

#4 MainMenu.build

目标:使用变量_selectedIndex将不同的容器小部件数组加载到列表视图中。

注意:当我注释掉时我没有收到错误,var menuLists = createMenuLists();所以问题来自我的小部件列表(容器小部件)列表的实例化。我知道我正在使用动态列表,但完全不确定为什么这段代码不起作用。它似乎特别打破了这种方法。知道我做错了什么吗?谢谢!

class MainMenu extends StatelessWidget {
  int _selectedIndex;
  var menuCategoriesArray;
  int numberOfItemsInCart = 0;

  MainMenu(this._selectedIndex, this.menuCategoriesArray);

  @override
  Widget build(BuildContext context) {
    var menuLists = createMenuLists();

    return ListView(
      children: [
        Row(
          children: [
            Expanded(
              flex: 8,
              child: Text(
                menuCategoriesArray[_selectedIndex],
                style: GoogleFonts.ubuntu(
                    fontSize: 39, fontWeight: FontWeight.bold),
              ),
            ),
            Expanded(
              flex: 2,
              child: Container(
                child: Row(
                  children: [
                    Icon(Icons.shopping_cart_outlined),
                    Text(numberOfItemsInCart.toString()),
                  ],
                ),
              ),
            ),
          ],
        ),
        menuLists[_selectedIndex],
      ],
    );
  }
}





createMenuCard(int whichMenuItem, var currentMenuList) {
  return MenuCard(
      currentMenuList[0][whichMenuItem],
      currentMenuList[1][whichMenuItem],
      currentMenuList[2][whichMenuItem],
      currentMenuList[3][whichMenuItem]);
}

createMenuList(int numberOfItemsInMenuList, var currentMenuList) {
  var listMenuOfCards;

  for (int i = 0; i < numberOfItemsInMenuList; i++) {
    listMenuOfCards[i] = createMenuCard(i, currentMenuList);
  }

  return listMenuOfCards;
}

createMenuLists() {
  var menuLists;

  for (int i = 0; i < getMenuArrays().length; i++) {
    menuLists[i] =
        createMenuList(getMenuArrays()[i][0].length, getMenuArrays()[i]);
  }

  return menuLists;
}

getMenuArrays() {
  //THE PIT MENU

  var nameArray = [
    'Angus Beef Brisket',
    'Pulled Pork',
    '1/2 BBQ Chicken',
    'St. Louis Style Pork Ribs - 6 Ribs',
    'St. Louis Style Pork Ribs - 12 Ribs',
    'Tri-Tip'
  ];

  var imageArray = [];
  for (int i = 0; i < nameArray.length; i++) {
    imageArray[i] = 'assets/images/empty_image.jpg';
  }

  var summaryArray = [
    'Slow smoked, sliced to provide perfect mix of brisket',
    'Pork butt dry rubbed, slow smoked, hand pulled daily',
    'Rocky\'s chicken, local favorite',
    'Extra meaty, dry rubbed, slow smoked',
    'Extra meaty, dry rubbed, slow smoked',
    'Black Angus tri-tip trimmed in house, dry rubbed and slow smoked',
  ];

  var priceArray = ['22.00', '20.00', '21.00', '22.00', '35', '23'];

  var menuArrays;

  menuArrays[0] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[1] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[2] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[3] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[4] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[5] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[6] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[7] = [imageArray, nameArray, summaryArray, priceArray];

  return menuArrays;
}

编辑:我认为错误可能是由于我最后在 getMenuArrays() 方法中实例化列表列表的方式。

编辑 2:我添加了一些 debugPrint()s,它们表明当我尝试将 menuArray 的值设置为其他数组时发生错误,这里:

变种菜单数组;

  menuArrays[0] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[1] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[2] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[3] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[4] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[5] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[6] = [imageArray, nameArray, summaryArray, priceArray];
  menuArrays[7] = [imageArray, nameArray, summaryArray, priceArray];

标签: flutter

解决方案


我能够通过对 menuArrays 数组中的每个项目使用 .add 而不是 [0] = ... [1] = ... 来解决这个问题。我还必须使用 .toList():

menuArrays.add([imageArray.toList(), nameArray.toList(), summaryArray.toList(), priceArray.toList()]);

不完全确定为什么,但这有效。总而言之,不要将 [n] = ... 用于列表。使用 .add 因为它们不是具有设定长度的数组。


推荐阅读