Я думаю, что вы, возможно, слишком усложняете вещи, каждое значение не обязательно должно быть сопоставлено с логическим значением, как я это делаю, я добавляю значение, которое проверяется в массив, затем проверяет, находится ли этот элемент в этом массиве, если оно это правда, если не ложь. Вам просто нужно помнить, чтобы удалить элемент, если флажок снят, вот вам пример кода.
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()
],
),