Flutter Form表单数字校验:仅禁止字母标点保留数字字符串是否可行?
实现方案
该需求完全可以实现,仅靠keyboardType: TextInputType.number的限制存在漏洞:用户可以通过粘贴操作输入字母、标点等非数字内容,我们可以搭配Flutter原生提供的输入格式化器实现严格过滤,同时直接拿到数字格式的字符串。
具体实现步骤
- 首先导入Flutter服务包,输入格式化器在该包中提供:
import 'package:flutter/services.dart'; - 给
TextFormField配置inputFormatters属性,使用FilteringTextInputFormatter.digitsOnly规则,即可自动过滤所有字母、标点、特殊符号,仅保留0-9的数字输入:TextFormField( // 弹出数字键盘,优化输入体验 keyboardType: TextInputType.number, inputFormatters: [ // 核心过滤规则:仅允许输入数字 FilteringTextInputFormatter.digitsOnly, ], decoration: const InputDecoration( labelText: '数字输入', hintText: '请输入数字', ), // 此处拿到的value默认就是纯数字格式的字符串,无需额外转换处理 onChanged: (value) { debugPrint('输入的数字字符串:$value'); }, // 表单校验可以直接基于该字符串做逻辑判断 validator: (value) { if (value == null || value.isEmpty) return '请输入数字'; if (int.parse(value) > 999) return '输入数值不能超过999'; return null; }, )
自定义扩展(可选)
如果需要支持小数点等符合数字格式的特殊符号,可自定义正则规则实现过滤,比如允许输入最多两位小数的数字:
FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d{0,2}$'))
这种实现方式对手动输入、粘贴输入的内容都会自动做过滤,不会出现非法字符,最终FormField返回的文本就是符合要求的数字格式字符串。
内容的提问来源于stack exchange,提问作者Muhammad Adnan
相关产品推荐
相关产品推荐

