无法 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);
              },
         ),
       ],
     );
  },
);
...