无法 Select 复选框列表平铺 Flutter
Cannot Select Checkbox List Tile Flutter
我创建了一个值映射来制作复选框。该映射由 String 和 bool 组成,当 bool 的值发生变化时,复选框值也应发生变化。
编辑 1:
我的 ListView 复选框
CheckboxListTile(
title: new Text(
key,
style: textHeaderStyle,
),
value: _selectedOrders.contains(undeliveryOrders[key]),
activeColor: Colors.pink,
checkColor: Colors.white,
onChanged: (bool value) {
setState(() {
if(value){
_selectedOrders.add(undeliveryOrders[key]);
undeliveryOrders[key] = value;
}else{
setState(() {
_selectedOrders.remove(undeliveryOrders[key]);
});
}
});
},
)
正在创建地图:
void _formatOrders(availableOrders) {
for (int i = 0; i < availableOrders.length; i++) {
var tempOrder = '${availableOrders[i].customer.uniqueInfo.name} , ${availableOrders[i].address}';
undeliveryOrders['$tempOrder'] = false;
}
print('$undeliveryOrders');
print('$numbers');
}
选择的订购方式
var _selectedOrders = [];
getItems() {
undeliveryOrders.forEach((key, value) {
if (value == false) {
_selectedOrders.add(key);
}
});
print(_selectedOrders);
_selectedOrders.clear();
}
您可以尝试使用以下代码吗?
onChanged: (bool value) {
setState(() {
undeliveryOrders[key] = value ?? false;
});
},
我认为你可能把事情复杂化了,每个值都不必映射到布尔值,我这样做的方式是我将要检查的值添加到数组中,然后检查该项目是否在该数组中,如果如果不是假的,那也是真的。如果未选中该复选框,您只需要记住删除该项目即可。这里有一些示例代码。
List<String> items = ['Item 1', 'Item 2', 'Item 3'];
List<String> isChecked = [];
//Initialized outside build
ListView(
children: <Widget>[
...items
.map(
(item) => CheckboxListTile(
subtitle: Text('This is a subtitle'),
secondary: Text('This is Secondary text'),
title: Text(item),
value: isChecked.contains(item),
onChanged: (bool value) {
if (value) {
setState(() {
isChecked.add(item);
});
} else {
setState(() {
isChecked.remove(item);
});
}
},
),
)
.toList()
],
),
在我的例子中,setState()
没有响应,请尝试使用 StatefulBuilder()
。
例如:
...
bool isSelected = false;
StatefulBuilder(
builder: (context, _setState) {
return ListView(
children: [
CheckboxListTile(
value: isSelected,
onChanged: (bool? value) {
_setState(() => isSelected = value);
},
),
],
);
},
);
...
我创建了一个值映射来制作复选框。该映射由 String 和 bool 组成,当 bool 的值发生变化时,复选框值也应发生变化。
编辑 1:
我的 ListView 复选框
CheckboxListTile(
title: new Text(
key,
style: textHeaderStyle,
),
value: _selectedOrders.contains(undeliveryOrders[key]),
activeColor: Colors.pink,
checkColor: Colors.white,
onChanged: (bool value) {
setState(() {
if(value){
_selectedOrders.add(undeliveryOrders[key]);
undeliveryOrders[key] = value;
}else{
setState(() {
_selectedOrders.remove(undeliveryOrders[key]);
});
}
});
},
)
正在创建地图:
void _formatOrders(availableOrders) {
for (int i = 0; i < availableOrders.length; i++) {
var tempOrder = '${availableOrders[i].customer.uniqueInfo.name} , ${availableOrders[i].address}';
undeliveryOrders['$tempOrder'] = false;
}
print('$undeliveryOrders');
print('$numbers');
}
选择的订购方式
var _selectedOrders = [];
getItems() {
undeliveryOrders.forEach((key, value) {
if (value == false) {
_selectedOrders.add(key);
}
});
print(_selectedOrders);
_selectedOrders.clear();
}
您可以尝试使用以下代码吗?
onChanged: (bool value) {
setState(() {
undeliveryOrders[key] = value ?? false;
});
},
我认为你可能把事情复杂化了,每个值都不必映射到布尔值,我这样做的方式是我将要检查的值添加到数组中,然后检查该项目是否在该数组中,如果如果不是假的,那也是真的。如果未选中该复选框,您只需要记住删除该项目即可。这里有一些示例代码。
List<String> items = ['Item 1', 'Item 2', 'Item 3'];
List<String> isChecked = [];
//Initialized outside build
ListView(
children: <Widget>[
...items
.map(
(item) => CheckboxListTile(
subtitle: Text('This is a subtitle'),
secondary: Text('This is Secondary text'),
title: Text(item),
value: isChecked.contains(item),
onChanged: (bool value) {
if (value) {
setState(() {
isChecked.add(item);
});
} else {
setState(() {
isChecked.remove(item);
});
}
},
),
)
.toList()
],
),
在我的例子中,setState()
没有响应,请尝试使用 StatefulBuilder()
。
例如:
...
bool isSelected = false;
StatefulBuilder(
builder: (context, _setState) {
return ListView(
children: [
CheckboxListTile(
value: isSelected,
onChanged: (bool? value) {
_setState(() => isSelected = value);
},
),
],
);
},
);
...