首页 > 解决方案 > RangeError(索引):无效值:有效值范围为空:使用 Checkbox 和 for 循环时返回 0

问题描述

class HostAMealCard extends StatefulWidget {
  HostAMealCard(this.combo);
  final Combo combo;
  @override
  _HostAMealCardState createState() => _HostAMealCardState();
}

class _HostAMealCardState extends State<HostAMealCard> {
  @override
  Widget build(BuildContext context) {
    return Container(
      height: (50 * widget.combo.items.length + 75).toDouble(),
      child: Card(
          child: ListView.builder(
        itemCount: widget.combo.items.length,
        physics: NeverScrollableScrollPhysics(),
        itemBuilder: (context, index) {
          return OneMeal(widget.combo, index);
        },
      )),
    );
  }
}

class OneMeal extends StatefulWidget {
  OneMeal(this.combo, this.index);
  final Combo combo;
  final int index;
  //int count = combo.items.length;

  @override
  State<StatefulWidget> createState() => OneMealState();
}

class OneMealState extends State<OneMeal> {
  List<bool> Vals = new List();

  @override
  void initState() {
    super.initState();

    int count = widget.combo.items.length;

    for (int i = 0; i < count; i++) {      //This for loop gives exception
      Vals[i] = false;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        Align(
          child: Text(widget.combo.items[widget.index].item.toString()),
          alignment: Alignment(-1, 0),
        ),
        Align(
            child: Text(widget.combo.items[widget.index].price.toString()),
            alignment: Alignment(0.2, 0)),
        Align(
            child: Checkbox(               //This checkbox gives exception
              value: Vals[widget.index],
              onChanged: (bool value) {
                setState(() {
                  Vals[widget.index] = value;
                });
              },
            ),
            alignment: Alignment(0.6, 0.4)),
      ],
    );
  }
}

HostAMEalCard 类是一张包含食物组合的卡片。每个项目都有一个与之关联的复选框。每张卡片中的项目数量是动态的。异常由 for 循环和复选框引发。HostAMEalCard 类也作为 FutureBuilder 的 itemBuilder 返回。有没有更简单的方法来实现我在这里尝试做的事情?

标签: flutterdart

解决方案


Vals长度为 0,因此访问它的任何位置当然会引发异常。

你应该做这个:

Vals.add(false)

或者更好的是,您可以替换 for 循环并ValsinitState这种方式初始化:

Vals = List<bool>.generate(widget.combo.items.length, (_) => false);

推荐阅读