Flutter 复选框表单验证

Flutter 复选框表单验证,flutter,Flutter,如何验证颤振表单中的复选框?每一次验证都可以正常工作,但复选框不会显示错误。 这是我的密码: FormField( validator: (value) { if (value == false) { return 'Required.'; } }, builder: (FormFieldState<dynamic> field) { return CheckboxListTile( value: checkboxValue

如何验证颤振
表单中的复选框
?每一次验证都可以正常工作,但复选框不会显示错误。 这是我的密码:

FormField(
  validator: (value) {
    if (value == false) {
      return 'Required.';
    }
  },
  builder: (FormFieldState<dynamic> field) {
    return CheckboxListTile(
      value: checkboxValue,
      onChanged: (val) {
        if (checkboxValue == false) {
          setState(() {
            checkboxValue = true;
          });
        } else if (checkboxValue == true) {
          setState(() {
            checkboxValue = false;
          });
        }
      },
      title: new Text(
        'I agree.',
        style: TextStyle(fontSize: 14.0),
      ),
      controlAffinity: ListTileControlAffinity.leading,
      activeColor: Colors.green,
    );
  },
),
FormField(
验证器:(值){
如果(值==false){
“必须”返回;
}
},
生成器:(FormFieldState字段){
返回CheckboxListTile(
值:checkboxValue,
一旦更改:(val){
if(checkboxValue==false){
设置状态(){
checkboxValue=true;
});
}else if(checkboxValue==true){
设置状态(){
checkboxValue=false;
});
}
},
标题:新文本(
“我同意。”,
样式:TextStyle(fontSize:14.0),
),
controlAffinity:ListTileControlAffinity.leading,
activeColor:Colors.green,
);
},
),

您可以尝试以下方法:

CheckboxListTile(
  value: checkboxValue,
  onChanged: (val) {
    setState(() => checkboxValue = val
  },
  subtitle: !checkboxValue
      ? Text(
          'Required.',
          style: TextStyle(color: Colors.red),
        )
      : null,
  title: new Text(
    'I agree.',
    style: TextStyle(fontSize: 14.0),
  ),
  controlAffinity: ListTileControlAffinity.leading,
  activeColor: Colors.green,
);

但是,上述答案是正确的,如果您希望显示与TextFormField小部件错误消息的默认布局更一致的错误消息,请将文本小部件包装在填充小部件中,并将其命名为十六进制颜色#e53935

注意:您可能需要调整左侧填充以适应CheckboxListTile小部件也包装在填充小部件中

检查以下代码:

bool\u termsChecked=false;
CheckboxListTile(
activeColor:Theme.of(context.accentColor),
标题:文本(“我同意”),
值:_termsChecked,
一旦更改:(布尔值)=>setState(()=>\u termsChecked=value),
副标题:!\u术语已勾选
?填充物(
填充:从LTRB(12.0,0,0,0)开始的边缘设置,
子项:文本('必填字段',样式:TextStyle(颜色:颜色(0xFFe53935),字体大小:12),)
:null,
),

这个问题的一个更干净的解决方案是创建一个扩展
FormField

我是如何做到这一点的:

类CheckboxFormField扩展了FormField{
CheckboxFormField(
{小部件标题,
FormFieldSetter已被保存,
FormFieldValidator验证程序,
bool initialValue=false,
bool autovalidate=false})
:超级(
已保存:已保存,
验证器:验证器,
initialValue:initialValue,
生成器:(FormFieldState){
返回CheckboxListTile(
稠密:state.hasrerror,
标题:标题,,
value:state.value,
onchange:state.didChange,
字幕:state.hasError
建造商(
生成器:(BuildContext上下文)=>文本(
state.errorText,
样式:TextStyle(颜色:Theme.of(context.errorColor)),
),
)
:null,
controlAffinity:ListTileControlAffinity.leading,
);
});
}

如果您想将复选框直接放在表单小部件树中,您可以使用下面提供的FormField小部件解决方案。我没有使用ListTile,而是使用了行和列,因为我的表单需要不同的布局

FormField<bool>(
  builder: (state) {
    return Column(
      children: <Widget>[
        Row(
          children: <Widget>[
            Checkbox(
              value: checkboxValue,
              onChanged: (value) {
                setState(() {
//save checkbox value to variable that store terms and notify form that state changed
                  checkboxValue = value;
                  state.didChange(value);
                });
              }),
            Text('I accept terms'),
          ],
        ),
//display error in matching theme
        Text(
          state.errorText ?? '',
          style: TextStyle(
            color: Theme.of(context).errorColor,
          ),
        )
      ],
    );
  },
//output from validation will be displayed in state.errorText (above)
  validator: (value) {
    if (!checkboxValue) {
      return 'You need to accept terms';
    } else {
      return null;
    }
  },
),
FormField(
建筑商:(州){
返回列(
儿童:[
划船(
儿童:[
复选框(
值:checkboxValue,
一旦更改:(值){
设置状态(){
//将复选框值保存到存储术语的变量,并通知表单状态已更改
checkboxValue=value;
状态变化(值);
});
}),
文本(“我接受条款”),
],
),
//匹配主题时显示错误
正文(
state.errorText??“”,
样式:TextStyle(
颜色:主题.of(上下文).errorColor,
),
)
],
);
},
//验证的输出将显示在state.errorText(如上)中
验证器:(值){
如果(!checkboxValue){
返回“您需要接受条款”;
}否则{
返回null;
}
},
),

您确定要使用该复选框吗?复选框允许用户将其值输入为true或false,以便在“空白”时不会出现错误,因为“空白”复选框是有效的输入。@SnakeyHips是的,我希望使用“我同意条款和条件”复选框。我还认为这是一个更干净的解决方案,与其他表单字段小部件更一致。我只需要添加一个6px的顶部填充,并将副标题对齐在中间。这就是我想出的lol,除了我使用的color.red,它更容易记住