Flutter中如何在TextFormField的Validator中验证两个变量(售价≤原价)
解决TextFormField验证销售价不超过原价的问题
原代码存在的问题
- 方法开头直接调用
double.parse(couponSalePriceCtrlr)错误:参数是TextEditingController而非字符串,且控制器初始text可能为空,直接解析会抛出异常。 validator参数定义错误:它仅能接收一个String?类型的输入参数,不能传入两个参数。
正确实现思路
- 在
validator内部获取两个控制器的文本值 - 先验证销售价的合法性(非空、符合数字格式)
- 再验证原价的合法性(避免用户未填写或格式错误导致比较失败)
- 将合法字符串转换为
double后,比较销售价是否大于原价,若大于则返回错误提示
修正后的完整代码
Widget editCouponSalePriceWidget(TextEditingController couponSalePriceCtrlr, TextEditingController couponOrigPriceCtrlr) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 0.0), child: TextFormField( style: const TextStyle(fontFamily: 'Poppins', fontSize: 13), controller: couponSalePriceCtrlr, keyboardType: TextInputType.number, decoration: InputDecoration( suffixText: "*", suffixStyle: TextStyle(color: Colors.red), labelText: 'Sale Price', labelStyle: const TextStyle( fontSize: 15, fontFamily: 'Poppins', color: Color(0xFF152C4C)), isDense: true, prefixIcon: const Icon(Icons.person), enabledBorder: OutlineInputBorder( borderSide: const BorderSide(color: Color(0xFFCECECE)), borderRadius: BorderRadius.circular(12), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: const BorderSide(color: Color(0xFFCECECE)), ), hintText: 'Orig Price', fillColor: const Color(0xFFFEFEFE), filled: true, ), validator: (value) { // 验证销售价是否为空或格式错误 if (value!.isEmpty || !RegExp(r'^\d+([.,]\d*)?$').hasMatch(value)) { return "请输入有效的销售价"; } // 获取原价文本并验证 String origPriceText = couponOrigPriceCtrlr.text.trim(); if (origPriceText.isEmpty || !RegExp(r'^\d+([.,]\d*)?$').hasMatch(origPriceText)) { return "请先输入有效的原价"; } // 转换为double类型并比较 try { // 统一替换逗号为点,兼容不同地区输入习惯 double salePrice = double.parse(value.replaceAll(',', '.')); double origPrice = double.parse(origPriceText.replaceAll(',', '.')); if (salePrice > origPrice) { return "销售价不能高于原价"; } } catch (e) { return "价格格式错误"; } return null; }, ), ); }
关键细节说明
- 明确参数类型:方法参数指定为
TextEditingController,避免类型模糊 - 格式兼容:处理逗号和点作为小数点的情况,替换后再解析,适配不同输入习惯
- 异常捕获:用
try-catch包裹解析逻辑,避免意外格式导致崩溃 - 分步验证:先确保两个价格都合法,再进行比较,给用户清晰的错误提示
内容的提问来源于stack exchange,提问作者flutternewbiee
相关产品推荐
相关产品推荐

