复选框状态未保留

Posted

技术标签:

【中文标题】复选框状态未保留【英文标题】:Checkbox state not preserved 【发布时间】:2022-01-17 12:08:57 【问题描述】:

我在 dart 中制作了一个自定义复选框小部件,并使用全局键来保存状态。

class CheckBox extends StatefulWidget 
final String label;
final void Function(dynamic) onChanged;

const CheckBox(required this.label, required this.onChanged, Key? key)
  : super(key: key);

@override
CheckBoxState createState() => CheckBoxState();


class CheckBoxState extends State<CheckBox> 
 final key = GlobalKey();
 late bool isChecked;

 @override
 void initState() 
   isChecked=false;
   super.initState();
  

  @override
  Widget build(BuildContext context) 
    return Padding(
     padding: const EdgeInsets.all(16.0),
     child: Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
    children: [
      Text(widget.label, style: Theme.of(context).textTheme.headline4),
      KeyedSubtree(
        key: key,
        child: Checkbox(
          activeColor: LightSeaGreen,
          checkColor: White,
          value: isChecked,
          onChanged: (value) 
            setState(() 
              isChecked = !isChecked;
            );
            widget.onChanged(value);
          ,
        ),
      ),
    ],
  ),
);


我使用上面的小部件填充了一个复选框列表,如下所示,

当我选中一个类别(即证书提供者)中的复选框并选中课程语言类别中的复选框时,证书提供者的选中复选框保持未选中状态(状态未保存)。当我从一个类别转到另一个类别时,我可以做些什么来保存状态?任何形式的帮助将不胜感激。

【问题讨论】:

当您更改类别时,会构建您的“CheckBox”小部件并调用“initState”并将值重置为 false。因此,您需要存储具有类别和值的父小部件。 【参考方案1】:

您不能使用全局键来保留所有响应的状态。您应该使用类(工厂)来保存您的响应并使用状态管理库来处理您的响应,提供者可能会很好地工作。或者,您可以使用像 hive 这样的本地数据库来存储您的响应,并且您可以随时获取这些响应,这将是最佳实践。 谢谢

【讨论】:

以上是关于复选框状态未保留的主要内容,如果未能解决你的问题,请参考以下文章

POST 未选中的 HTML 复选框

使用复选框导出 VueJS 呈现的 HTML 无法保留选中状态

在android上创建一个三态复选框

滚动列表视图 BaseAdapter 上的复选框选中/未选中状态更改

表单提交后选中的复选框保持选中/未选中状态

JQuery 正在更改复选框值,但复选框未显示为选中状态