Flutter中基于form_field_validator实现必填与自定义日期验证器
实现并调用自定义DateValidator步骤
1. 编写DateValidator类
继承TextFieldValidator,根据业务需求实现日期验证逻辑。以下提供两种常见场景的实现:
场景1:验证日期有效性+不晚于指定日期
class DateValidator extends TextFieldValidator { final DateTime maxDate; DateValidator({required String errorText, required this.maxDate}) : super(errorText); // 空值时跳过该验证(必填逻辑已由RequiredValidator处理) @override bool get ignoreEmptyValues => true; @override bool isValid(String? value) { if (value == null || value.isEmpty) return true; // 尝试将输入字符串转为DateTime DateTime? inputDate = DateTime.tryParse(value); if (inputDate == null) return false; // 验证输入日期不晚于指定的maxDate return inputDate.isBefore(maxDate) || inputDate.isAtSameMomentAs(maxDate); } @override String? call(String? value) { return isValid(value) ? null : errorText; } }
场景2:验证日期格式(如yyyy-MM-dd)
class DateValidator extends TextFieldValidator { DateValidator({required String errorText}) : super(errorText); @override bool get ignoreEmptyValues => true; @override bool isValid(String? value) { if (value == null || value.isEmpty) return true; // 匹配yyyy-MM-dd格式的正则 RegExp dateRegex = RegExp(r'^\d{4}-\d{2}-\d{2}$'); if (!dateRegex.hasMatch(value)) return false; // 二次验证是否为合法日期(排除2月30日这类无效日期) return DateTime.tryParse(value) != null; } @override String? call(String? value) { return isValid(value) ? null : errorText; } }
2. 在表单中调用DateValidator
直接在目标字段的validator列表中添加DateValidator实例,传入对应参数即可:
Theme( data: ThemeData(primarySwatch: Colors.red), child: GenericDateTimePickerBanorteWidget( controller: fechaDiagnosticoController, validator: [ RequiredValidator(errorText: "Campo obligatorio"), // 示例:验证日期不晚于当前日期,错误提示自定义 DateValidator( errorText: "Fecha no puede ser futura", date: DateTime.now() ) ], ), ),
关键细节说明
ignoreEmptyValues设为true:避免和RequiredValidator的必填验证重复触发报错,空值仅由必填验证处理。- 验证逻辑可灵活修改:根据实际业务需求调整
isValid方法,比如验证日期是否早于指定日期、是否在某个时间区间内等。
内容的提问来源于stack exchange,提问作者Michael Adolfo Huerta Ramirez
相关产品推荐
相关产品推荐

