我已经创建了一个值映射表以创建复选框。该映射由String和bool组成,当bool的值更改时,复选框值也应更改。
如果我手动设置地图,则使用类似这样的数据
Map<String, bool> examples = {
'One': false,
'Two': false,
'Three': false,
};
但是,当通过我的列表自动分配数据时,我在选择产品时遇到问题。
创建地图:
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();
}
我的ListView复选框
ListView(
shrinkWrap: true,
addRepaintBoundaries: true,
children: undeliveryOrders.keys.map((String key) {
return Padding(
padding: const EdgeInsets.all(4.0),
child: new CheckboxListTile(
title: new Text(
key,
style: textHeaderStyle,
),
value: undeliveryOrders[key],
activeColor: Colors.pink,
checkColor: Colors.white,
onChanged: (bool value) {
setState(() {
undeliveryOrders[key] = value;
});
},
),
);
}).toList(),
),
您可以尝试使用下面的代码吗?
onChanged: (bool value) {
setState(() {
undeliveryOrders[key] = value ?? false;
});
},
我认为您可能会使每个值都不必映射到布尔值而使事情复杂化,我将其添加到要检查的值的数组中,然后检查该项目是否在该数组中,如果它是它的如果不是,则为true。您只需要记住如果未选中此复选框,则删除该项目,这里是一些示例代码。
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()
],
),