如何区分颤振中的复选框列表

时间:2021-06-17 10:05:38

标签: flutter

我正在尝试生成一个带有 checkboxlisttile 的卡片列表,以便可以单独检查每个项目,但它是生成的,因此我无法为每个项目创建一个 set var。

bool _isChecked = false;
CheckboxListTile(
                  title: Text(itemNameList[index]),
                  secondary: Icon(itemIconList[index]),
                  subtitle: Row(
                    children: [
                      Text('R ${itemPriceList[index]}'),
                      Padding(
                        padding: const EdgeInsets.only(left: 25.0),
                        child: Text("x2"),
                      ),
                    ],
                  ),
                  value: _isChecked,
                  onChanged: (bool? value) {
                    setState(() {
                      if(_isChecked == true){
                        _isChecked = false;
                      }else{
                        _isChecked = true;
                      }
                    });
                  },
                ),

有什么提示可以让它生成但保持它自己的状态,因为当点击它时它会检查同时生成的所有 checkboxlisttiles?

1 个答案:

答案 0 :(得分:0)

因为您使用一个变量来处理所有项目的可检查性,以及当您检查和项目时;它更新变量值,并相应地 setState 更新所有项目。

解决方案:您的方法非常复杂。您正在创建项目的每个属性的列表。一种解决方案是创建另一个处理可检查性的布尔值列表。第二种解决方案是创建一个具有所有属性的自定义模型列表。例如

class YourModelName{
  //if your date type is different use that
  String name = ''; 
  String icon = '';
  String price = '';
  bool isChecked = false;
  YourModelName({
    //user @required if you are not using null safety
    required this.name,
    required this.icon,
    required this.price,
    required this.isChecked
  });
}

模型列表的用法如下

CheckboxListTile(
                  title: Text(modelsList[index].name),
                  secondary: Icon(modelsList[index].icon),
                  subtitle: Row(
                    children: [
                      Text('R ${modelsList[index].price}'),
                      Padding(
                        padding: const EdgeInsets.only(left: 25.0),
                        child: Text("x2"),
                      ),
                    ],
                  ),
                  value: model.isChecked,
                  onChanged: (bool? value) {
                    setState(() {
                      modelsList[index].isChecked = !modelsList[index].isChecked;
                    });
                  },
                )