TextFormField无法输入负号,如何实现仅支持正负5位整数?
解决Flutter TextFormField无法输入负号且限制正负5位整数的问题
问题原因
- 你使用的
TextInputType.number键盘类型默认不显示负号按钮,导致无法输入负号; - 原正则
-?[0-9]仅允许单个字符为负号或数字,但未限制负号只能出现在开头,同时LengthLimitingTextInputFormatter(5)会让带负号的输入最多只能有4位数字,不符合5位整数的要求。
解决方案
方案一:调整键盘类型+正则组合
直接修改现有参数,启用带负号的键盘,同时用正则限制输入格式和长度:
TextFormField( maxLines: 1, // 启用带负号的数字键盘 keyboardType: TextInputType.numberWithOptions(signed: true), enableSuggestions: false, inputFormatters: [ // 带负号最多6位(-+5位数字),不带负号最多5位 LengthLimitingTextInputFormatter(6), // 允许开头可选负号,后面跟任意数字(支持输入过程中的中间状态) FilteringTextInputFormatter.allow(RegExp(r'^-?\d*$')), // 禁止数字部分超过5位:带负号时数字段不超5位,不带时整体不超5位 FilteringTextInputFormatter.deny(RegExp(r'^-\d{6,}$|^\d{6,}$')), ], onChanged: (val) {}, );
方案二:自定义输入格式化器(更精准控制)
如果需要更严格的输入规则,可以自定义TextInputFormatter完全控制输入逻辑:
class SignedFiveDigitFormatter extends TextInputFormatter { @override TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) { final text = newValue.text; // 空输入直接允许 if (text.isEmpty) return newValue; // 处理带负号的情况:负号开头,后面最多5位数字 if (text.startsWith('-')) { final digitsPart = text.substring(1); // 数字部分超过5位,拒绝输入 if (digitsPart.length > 5) return oldValue; // 数字部分仅含数字,允许输入 if (RegExp(r'^\d*$').hasMatch(digitsPart)) return newValue; } // 处理无负号的情况:最多5位纯数字 else { if (text.length > 5) return oldValue; if (RegExp(r'^\d*$').hasMatch(text)) return newValue; } // 不符合规则的输入,回退到旧值 return oldValue; } } // 使用自定义格式化器 TextFormField( maxLines: 1, keyboardType: TextInputType.numberWithOptions(signed: true), enableSuggestions: false, inputFormatters: [ SignedFiveDigitFormatter(), ], onChanged: (val) {}, );
内容的提问来源于stack exchange,提问作者pcba-dev
相关产品推荐
相关产品推荐

