Flutter中FilteringTextInputFormatter正则表达式为何失效?
Flutter TextField无法输入数字的解决方案
你的问题出在正则表达式和FilteringTextInputFormatter.allow的匹配逻辑不兼容:
- 原正则
^\d+\.?\d{1,2}要求文本必须以至少一个数字开头,后跟可选小数点和1-2位小数,但allow方法的逻辑是允许匹配该正则的字符/子串,而非验证整个文本的完整状态。当你输入第一个数字时,过滤逻辑会误判导致无法输入。
修复方案
1. 调整正则匹配所有合法状态
使用能覆盖所有中间输入场景的正则(包括空、仅整数、整数加小数点、整数加1-2位小数),同时用^和$限定整个文本范围:
FilteringTextInputFormatter.allow(RegExp(r"^\d*\.?\d{0,2}$"));
如果不允许空输入,将\d*改为\d+,强制用户先输入至少一个数字:
FilteringTextInputFormatter.allow(RegExp(r"^\d+\.?\d{0,2}$"));
2. 自定义过滤逻辑(更精准)
如果需要禁止单独输入小数点这类场景,用FilteringTextInputFormatter.withFunction自定义规则:
FilteringTextInputFormatter.withFunction((oldValue, newValue) { final text = newValue.text; // 禁止纯小数点输入 if (text == '.') return oldValue; // 验证是否符合最多两位小数的规则 final validPattern = RegExp(r"^\d*\.?\d{0,2}$"); return validPattern.hasMatch(text) ? newValue : oldValue; })
内容的提问来源于stack exchange,提问作者ShrimpCrackers
相关产品推荐
相关产品推荐

