ModalBottomSheet Flutter中的Group复选框



如何在modalbottomsheet中应用组复选框?我有创建组复选框和它的工作良好。但当我把它放在modalbottomsheet中时,状态不会立即改变(需要重新打开才能看到值的变化(。我必须用StatefulBuilder包装checkboxListTile,并给出StateSetter。有解决方案吗?谢谢

这是我的代码

Column(
children: [
StatefulBuilder(builder:
(BuildContext context,
StateSetter setState) {
return CheckboxListTile(
controlAffinity:
ListTileControlAffinity.leading,
value: checkAllPermit,
title: Text('Permit', style: TextStyle(fontWeight: FontWeight.bold)),
onChanged: (value) {
setState(() {
checkAllPermit = value;
_permitType.forEach((tipePermit){
tipePermit.value = value;
});
});
},
);
}),
ListView.builder(
shrinkWrap: true,
itemCount: _permitType.length,
itemBuilder: (context, index) {
return StatefulBuilder(builder:
(BuildContext context,
StateSetter state) {
return CheckboxListTile(
controlAffinity:
ListTileControlAffinity.leading,
value: _permitType[index].value,
title: Text(_permitType[index].title),
onChanged: (value) {
state(() {
_permitType[index].value = value;
});
},
);
});
},
),
],
),

List.forEach在希望使用List的每个元素执行操作的情况下非常有用。

但当你想更新你所在州的列表时,这不是一个好方法。

当你做

_permitType.forEach((tipePermit){
tipePermit.value = value;
});

您只是在更新_permitType中各个元素的引用,而不是实际更新_permitType的引用,这会导致UI无法更新。

相反,

_permitType = _permitType.map((_) => value);

使用map不仅可以将每个元素更新为value,还可以通过调用.map_permitType的引用更改为此新列表。

其次,

当您调用从StatefulBuilder获得的StateSetter时,只有构建器内部的小部件会重新构建,而builder外部的小部件不会重新构建。

在您的用例中,似乎不需要StatefulBuilder,因为您没有使用它提供的context

因此,只需移除StatefulBuilder并正常使用即可。

最新更新