Flutter中如何为TextFormField设置最大单词数验证?
Flutter实现TextFormField最多50个单词限制
你之前用的LengthLimitingTextInputFormatter是限制字符长度,要实现最多50个单词的限制,可以通过自定义输入格式化器+表单验证来完成:
1. 自定义单词限制输入格式化器
这个格式化器会在用户输入时实时截断超出的单词:
class WordLimitingTextInputFormatter extends TextInputFormatter { final int maxWords; WordLimitingTextInputFormatter(this.maxWords); @override TextEditingValue formatEditUpdate(TextEditingValue oldValue, TextEditingValue newValue) { // 拆分单词,兼容连续空格、首尾空格的情况 final words = newValue.text.trim().split(RegExp(r'\s+')); final wordCount = newValue.text.trim().isEmpty ? 0 : words.length; if (wordCount <= maxWords) { return newValue; } else { // 截取前maxWords个单词,末尾保留空格方便继续输入(可选) final limitedText = words.sublist(0, maxWords).join(' ') + ' '; return TextEditingValue( text: limitedText, selection: TextSelection.collapsed(offset: limitedText.length), ); } } }
2. 在TextFormField中使用
配合验证器实现提交时的二次校验:
TextFormField( inputFormatters: [ WordLimitingTextInputFormatter(50), // 实时限制最多50个单词 ], validator: (value) { if (value?.trim().isEmpty ?? true) { return '请输入内容'; } final wordCount = value!.trim().split(RegExp(r'\s+')).length; if (wordCount > 50) { return '最多允许输入50个单词'; } return null; }, decoration: const InputDecoration( labelText: '输入内容', hintText: '最多输入50个单词', ), )
说明
- 用
RegExp(r'\s+')拆分单词,避免把连续空格、制表符等空白字符当成多个单词 - 输入格式化器负责实时拦截超出的输入,验证器负责在表单提交时给出明确提示,双重保障限制效果
内容的提问来源于stack exchange,提问作者Vrusti Patel
相关产品推荐
相关产品推荐

