flutter - 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 返回。有没有更简单的方法来实现我在这里尝试做的事情?
解决方案
Vals
长度为 0,因此访问它的任何位置当然会引发异常。
你应该做这个:
Vals.add(false)
或者更好的是,您可以替换 for 循环并Vals
以initState
这种方式初始化:
Vals = List<bool>.generate(widget.combo.items.length, (_) => false);