Android 颤振-如何在复选框的动态列表中设置复选框小部件的状态

Android 颤振-如何在复选框的动态列表中设置复选框小部件的状态,android,dart,flutter,Android,Dart,Flutter,对不起,如果这不是很清楚。我欢迎任何关于澄清的建议,因为我是一个新手,也不太会问关于StackOverflow的问题 我将公布哪些有效,哪些无效。基本上,我想有一个Perk小部件,其中包含不同数量的复选框小部件。当我在build方法中创建小部件时,我可以设置它们的状态(选中或取消选中),但是在列表中使用for循环动态创建复选框小部件,并将该列表传递到一行会使复选框无响应 不起作用(但我不知道为什么,这就是我想要的) 导入“包装:颤振/材料.省道”; 导入“package:glumhaven_en

对不起,如果这不是很清楚。我欢迎任何关于澄清的建议,因为我是一个新手,也不太会问关于StackOverflow的问题

我将公布哪些有效,哪些无效。基本上,我想有一个Perk小部件,其中包含不同数量的复选框小部件。当我在build方法中创建小部件时,我可以设置它们的状态(选中或取消选中),但是在列表中使用for循环动态创建复选框小部件,并将该列表传递到一行会使复选框无响应

不起作用(但我不知道为什么,这就是我想要的)

导入“包装:颤振/材料.省道”;
导入“package:glumhaven_enhancement_calc/data/constants.dart”;
类Perk扩展StatefulWidget{
最终检查;
最终字符串细节;
最终列表图标;
特权(this.numochecks、this.details、this.icons);
@凌驾
State createState()=>PerkState();
}
类PerkState扩展State{
国际货币基金组织;
字符串详细信息;
列出图标;
bool\u isChecked=false;
清单清单=[];
@凌驾
void initState(){
super.initState();
_numOfChecks=widget.numOfChecks;
_details=widget.details;
_icons=widget.icons;
设置状态(){
无效项更改(布尔值){
//设置状态(){
_isChecked=val;
//    });
打印('clliccked'+val.toString());
}
对于(int x=0;x<\u numochecks;x++){
检查表。添加(复选框)(
值:\已检查,
一旦更改:(布尔值)=>\u项更改(值),
),);
}
});
}
小部件构建(构建上下文){
返回容器(
颜色:颜色。灰色。不透明度(0.75),
孩子:排(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
//这里我传递了上面创建的复选框列表,但是它们
//不响应用户单击
世界其他地区(儿童:检查表),
扩大(
子:文本(
_详情,,
样式:文本样式(fontFamily:secondaryFontFamily),
),
),
],
));
}
}
有效(但我必须硬编码复选框的数量-我需要能够根据numOfChecks参数动态创建它们)

导入“包装:颤振/材料.省道”;
导入“package:glumhaven_enhancement_calc/data/constants.dart”;
类Perk扩展StatefulWidget{
最终检查;
最终字符串细节;
最终列表图标;
特权(this.numochecks、this.details、this.icons);
@凌驾
State createState()=>PerkState();
}
类PerkState扩展State{
国际货币基金组织;
字符串详细信息;
列出图标;
bool\u isChecked=false;
清单清单=[];
@凌驾
void initState(){
super.initState();
_numOfChecks=widget.numOfChecks;
_details=widget.details;
_icons=widget.icons;
}
无效复选框已选中(布尔值){
//设置状态(){
_isChecked=val;
//    });
打印('clliccked'+val.toString());
}
小部件构建(构建上下文){
返回容器(
颜色:颜色。灰色。不透明度(0.75),
孩子:排(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
世界其他地区(儿童:
[
//在这里,我根据数字创建复选框,但它是
//显然,这只是为了让它工作
复选框(
值:\已检查,
一旦更改:(布尔值)=>checkboxChecked(值),
),
_numOfChecks>1?复选框(
值:\已检查,
一旦更改:(布尔值)=>checkboxChecked(值),
):Container(),
_numOfChecks>2?复选框(
值:\已检查,
一旦更改:(布尔值)=>checkboxChecked(值),
):Container(),
_numOfChecks>3?复选框(
值:\已检查,
一旦更改:(布尔值)=>checkboxChecked(值),
):Container(),
_numOfChecks>4?复选框(
值:\已检查,
一旦更改:(布尔值)=>checkboxChecked(值),
):Container(),
]
),
扩大(
子:文本(
_详情,,
样式:文本样式(fontFamily:secondaryFontFamily),
),
),
],
));
}
}
奖金


我还需要在sharepreferences中保存每个复选框状态。我只是想为每个条目创建一个单独的条目,但我相信有一种更有效的方法。他们不需要做任何事情,只需要记住他们是否被检查或取消检查,并通过重新启动来保持这一点。

无效部分有很多错误

您必须在Perk类中存储复选框(标题、图标、计数)的详细信息。你只需要标题和图标。然后,您可以通过调用titles.length来检索复选框count。 检查项目的状态必须在状态类(列表检查表)内

将_检查表的类型更改为列表,并将其初始化为initState

@override
void initState() {
    super.initState();
    ...
    _checkList = List(widget.titles.length);// or List.generate(widget.numOfChecks, (i) => false);
}
要构建大量小部件(或其他项目),可以使用以下方法:

Row(
  children: List.generate(
    _numOfChecks,
    (i) => Checkbox(
      value: _checkList[i],
      onChanged: (bool value) => setState(() { _checkList[i] = value; }),
    )
  ).toList();
)
我希望我的回答能帮助您找到正确的解决方案。

帮我解决这个问题
@override
void initState() {
    super.initState();
    ...
    _checkList = List(widget.titles.length);// or List.generate(widget.numOfChecks, (i) => false);
}
Row(
  children: List.generate(
    _numOfChecks,
    (i) => Checkbox(
      value: _checkList[i],
      onChanged: (bool value) => setState(() { _checkList[i] = value; }),
    )
  ).toList();
)