我试图在对话框上提交表单,我有一个DateTimePicker按钮,需要在提交之前对它进行验证,我想做的是在没有日期的情况下显示文本错误通过改变我自己的变量" isvalidate "到false,但UI没有更新,我必须关闭对话框,重新打开它,看到错误文本,即使我包装我的列与StatefulBuilder
my dialog photo here
这是我的代码
StatefulBuilder(builder: (context, StateSetter setState) {
return isValid == false
? Column(
children: [
ElevatedButton(
onPressed: () {
DateTimePicker(context)
.then((value) => setState(() {
_appointmentDateTime = value;
}));
},
child: Text(getTimeDate())),
Text(
'error',
style: TextStyle(
color: Colors.red, fontSize: 10),
),
],
)
: Column(
children: [
ElevatedButton(
onPressed: () {
DateTimePicker(context)
.then((value) => setState(() {
_appointmentDateTime = value;
}));
},
child: Text(getTimeDate())),
],
);
})
验证表单+切换isValid值工作正常
OutlinedButton(
onPressed: () async {
if (_formKey.currentState.validate() &&
_appointmentDateTime != null) {
String date = DateFormat('yyyy-MM-dd hh:mm')
.format(_appointmentDateTime);
var appointment = Appointment(
patientName: widget.patient.name,
date: date,
hospital: _hospitalController.text,
await FirebaseApi.addPatientAppointment(
widget.patient.id, appointment);
print('Appointment Created ');
_formKey.currentState.reset();
setState(() {
translator = null;
_appointmentDateTime = null;
});
Navigator.pop(context);
}
else {
setState(() {
isValid = !isValid;
});
}
},
child: Text('Add Appointment')),
在处理对话框时编写这样的代码可能会令人困惑。您在OutlinedButton
中使用的setState
与StatefulBuilder
中使用的setState
不同。你需要将OutlinedButton也包含在StatefulBuilder
中。如果你曾经在一个有状态的小部件中使用StatefulBuilder
,最好使用一个不同的名称,例如setDialogState。
最好为您的Dialog内容创建一个单独的有状态小部件类,并传递formKey和其他任何东西,而不是在本例中使用StatefulBuilder
,以避免混淆。