Flet InputFilter 输入过滤器实战:用正则表达式精确约束 TextField 输入
前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载在 Flet 中InputFilter是一套面向文本输入控件的即时过滤/校验机制它利用正则表达式在用户键入的瞬间拦截非法字符或非法格式实现输入即约束。无论是让手机号输入框只接受数字、让用户名输入框只接受字母还是把粘贴进来的非法内容自动替换为合法字符都可以通过给TextField、CupertinoTextField等控件设置input_filter属性完成。读完本文你将掌握flet.InputFilter的全部参数语义、两个内置预定义过滤器NumbersOnlyInputFilter、TextOnlyInputFilter的用法以及它背后的 Flutter 层实现原理。本文内容以 inputfilter.md 为骨架并深入当前仓库的 Python 侧定义与 Flutter 侧实现进行补充说明。InputFilter 是什么从源码看InputFilter定义在 textfield.py 中官方类注释将其描述为An input filter that uses a regular expression to allow or deny/block certain patterns in the input.即一个用正则表达式来允许或拒绝/阻断输入中特定模式的过滤器。它通过TextField.input_filter属性见 textfield.py挂载到文本输入控件上提供逐键as-you-type的过滤与校验input_filter: Optional[InputFilter] None Provides as-you-type filtering/validation. Similar to the on_change callback, the input filters are not applied when the content of the field is changed programmatically. 需要特别留意源码中的这条说明过滤器只在用户键入时生效当字段内容被程序化修改programmatically时过滤器不会应用这一点与on_change回调的行为类似。参数详解六个字段控制过滤行为InputFilter是一个value修饰的数据类共包含六个字段全部定义在 textfield.py参数类型默认值说明regex_stringstr必填过滤用的正则表达式模式。官方建议使用原始字符串前缀r如rpatternallowboolTrue匹配到的模式是允许还是拒绝/阻断replacement_stringstr用于替换被禁止/阻断模式的字符串multilineboolFalse正则是否匹配多行。为True时^和$匹配每行的行首行尾为False时匹配整个输入的起始与结束位置case_sensitiveboolTrue正则是否区分大小写unicodeboolFalse正则是否使用 Unicode 模式dot_allboolFalse正则中的.是否匹配换行符行终止符其中dot_all与multiline作用于不同的模式字符两者互不影响可以单独使用也可以组合使用WhenFalse, the.character matches a single character, unless that character terminates a line. WhenTrue, then the.character will match any single character including line terminators.参数语义速查allowTrue默认输入文本整体必须匹配regex_string否则整个新输入被拒绝即白名单语义只放行匹配的文本。allowFalse凡是匹配到regex_string的内容都被视为非法然后使用replacement_string将其替换即黑名单语义用于剥离非法字符。内置预定义过滤器为避免重复编写常见正则仓库在 textfield.py 中内置了两个开箱即用的过滤器且均已通过 textfield.py 的模块导出列表对外暴露可直接通过ft.前缀使用class NumbersOnlyInputFilter(InputFilter): Allows only numbers. def __init__(self): super().__init__(regex_stringr^[0-9]*$, allowTrue, replacement_string) class TextOnlyInputFilter(InputFilter): Allows only text. def __init__(self): super().__init__(regex_stringr^[a-zA-Z]*$, allowTrue, replacement_string)NumbersOnlyInputFilter正则r^[0-9]*$只允许数字TextOnlyInputFilter正则r^[a-zA-Z]*$只允许英文字母a-z、A-Z。可以看到两个预定义过滤器本质上都是allowTrue的白名单式过滤——输入必须是完全由数字或字母组成的字符串否则键入被拒绝。注意TextOnlyInputFilter的正则只包含 ASCII 字母不包含空格、数字和标点也不含中文等多字节字符需要更宽松约束时请自行构造InputFilter。使用示例示例一只允许数字输入CupertinoTextField来自 inputfilter.md 的官方示例使用CupertinoTextField配合显式构造的InputFilterft.CupertinoTextField( placeholder_textOnly numbers are allowed, input_filterft.InputFilter(allowTrue, regex_stringr^[0-9]*$, replacement_string) )这里allowTrue、正则r^[0-9]*$的效果是用户输入的文本必须整体是零个或多个数字任何非数字字符的键入都会被即时拒绝。示例二只允许字母输入TextField官方示例同样展示了在 Material 风格TextField上直接使用预定义过滤器ft.TextField( labelOnly letters are allowed, input_filterft.TextOnlyInputFilter() )TextOnlyInputFilter()无需任何参数其内部已自带r^[a-zA-Z]*$正则。底层原理Flutter 侧的 CustomFilteringTextInputFormatterinput_filter属性最终会映射到 Flutter 的TextInputFormatter机制。在 utils/textfield.dart 中Flet 定义了parseInputFilter解析函数与CustomFilteringTextInputFormatter类该类继承自 Flutter 框架自带的FilteringTextInputFormatterfactory CustomFilteringTextInputFormatter.fromMap(Mapdynamic, dynamic value) { final pattern RegExp( value[regex_string]?.toString() ?? , multiLine: parseBool(value[multiline], false)!, unicode: parseBool(value[unicode], false)!, caseSensitive: parseBool(value[case_sensitive], true)!, dotAll: parseBool(value[dot_all], false)!, ); return CustomFilteringTextInputFormatter._(pattern, allow: parseBool(value[allow], true)!, replacementString: value[replacement_string]?.toString() ?? ); }可以看到Python 侧InputFilter的六个字段被逐一序列化为 map 键regex_string、multiline、unicode、case_sensitive、dot_all、allow、replacement_string与上一节参数表一一对应。随后构造出的RegExp选项也直接由multiline、unicode、case_sensitive、dot_all驱动。formatEditUpdate是每次编辑键入、粘贴、IME 输入时都会被调用的核心钩子其逻辑是命中即放行、否则整体拒绝override TextEditingValue formatEditUpdate( TextEditingValue oldValue, TextEditingValue newValue) { // Check if the new value matches the regex pattern and return it if it does if (_pattern.hasMatch(newValue.text)) { return newValue; } return oldValue; }即当newValue.text匹配正则时返回新值接受本次编辑否则返回oldValue回退到旧值拒绝本次编辑。过滤器在哪些控件上生效input_filter不仅适用于 Material 风格TextField从当前仓库的 Dart 源码看同样支持TextFieldtextfield.dart 中读取input_filter并将其加入inputFormatters列表CupertinoTextFieldcupertino_textfield.dart 中同样读取并加入inputFormattersDropdowndropdown.dart 在可编辑下拉场景中也会应用inputFilter。三者均通过control.getTextInputFormatter(input_filter)解析最终交给 Flutter 的TextInputFormatter管线执行。进阶灵活构造自定义过滤器官方内置的两个过滤器只是数字/字母白名单这一种形态。借助allow与replacement_string的组合你可以构造更多实用模式例如拒绝并替换特定字符黑名单禁止用户输入符号一旦出现就用_替换ft.TextField( labelNo allowed, input_filterft.InputFilter( regex_stringr, allowFalse, replacement_string_, ) )自定义白名单只允许数字与横线如电话号码、订单号ft.TextField( labelDigits and dashes only, input_filterft.InputFilter( regex_stringr^[0-9\-]*$, allowTrue, replacement_string, ) )需要说明的是replacement_string与allowFalse的替换行为最终交由 Flutter 框架的FilteringTextInputFormatter处理逐字符替换匹配到的非法片段而allowTrue时replacement_string通常留空即可。使用注意事项仅作用于用户键入input_filter是即时过滤程序化修改字段内容例如在代码中直接赋值value不会经过过滤器校验这一点在 textfield.py 的文档注释中有明确说明。白名单需整体匹配allowTrue时正则必须覆盖整个输入串典型写法是^...$锚定否则编辑会被拒绝。预定义过滤器正是采用r^[0-9]*$、r^[a-zA-Z]*$这种整体锚定写法。正则写法建议构造InputFilter时推荐使用 Python 原始字符串r...避免\d、\s等反斜杠序列被转义破坏。非输入校验替代品input_filter解决的是输入过程中不让非法内容进来如果需要在提交时校验合法性并给出错误提示应配合TextField的error_text、on_submit等校验机制使用两者是互补关系。参考路径类型文档website/docs/types/inputfilter.mdPython 侧类定义与预定义过滤器sdk/python/packages/flet/src/flet/controls/material/textfield.py#L190-L266Flutter 侧解析与实现packages/flet/lib/src/utils/textfield.dart#L6-L46TextField 应用过滤器packages/flet/lib/src/controls/textfield.dart#L182-L189CupertinoTextField 应用过滤器packages/flet/lib/src/controls/cupertino_textfield.dart#L187-L189赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐ALTCHA革命性GDPR合规验证码替代方案如何彻底告别传统CAPTCHA烦恼ALTCHA革命性GDPR合规验证码替代方案如何彻底告别传统CAPTCHA烦恼 在当今数字化时代网站安全与用户体验之间的平衡一直是开发者面临的重大挑战。Nuclide任务输出过滤规则正则表达式与关键词Nuclide任务输出过滤规则正则表达式与关键词 在日常开发中你是否经常被大量的任务输出信息淹没难以快速定位关键内容Nuclide作为一款基于Atom的开发工具ReLLM用正则表达式精确控制语言模型输出ReLLM用正则表达式精确控制语言模型输出 项目介绍 在自然语言处理领域语言模型LLM的输出往往充满了不确定性难以精确控制。然而ReLLM项目的出现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Linux信号机制与signal函数实战:从底层原理到生产避坑指南

Linux信号机制与signal函数实战:从底层原理到生产避坑指南

1. signal到底是什么:从一次线上崩溃说起先别急着看函数原型,我给你讲一个我自己踩过的坑。有次负责一个消息推送服务,上线后跑了两三天,突然收到告警,进程没了。登录服务器查日志,最后一行停在某个第三方库…

2026/9/23 19:42:52 阅读更多 →
service-logV2.zip 解压与日志分析:从完整校验到快速定位问题

service-logV2.zip 解压与日志分析:从完整校验到快速定位问题

简介:这是一份面向微服务开发与运维人员的服务日志管理解决方案,聚焦分布式环境下日志的采集、存储、查询与分析,适用于需要搭建统一日志平台或排查微服务链路问题的场景。压缩包共43个文件,以Java源码为主(28个java&a…

2026/9/23 19:42:52 阅读更多 →
3步搞懂PubMed影响因子源码解析与避坑指南

3步搞懂PubMed影响因子源码解析与避坑指南

3步搞懂PubMed影响因子源码解析与避坑指南 看了一堆教程还是不会写项目?别急,问题往往出在你对核心数据的理解只停留在表面。很多新手在抓取PubMed数据时,对着官方文档里的字段一头雾水,不知道如何提取影响因子,更别提通过源码解析来优化你…

2026/9/23 19:42:52 阅读更多 →

最新新闻

555张仓库工人YOLO数据集:小而实的工业检测落地起点

555张仓库工人YOLO数据集:小而实的工业检测落地起点

简介:本资源是面向YOLO系列目标检测算法研究与工程实践的专用仓库工人场景数据集,适用于计算机视觉初学者、算法工程师及工业质检项目开发者,可直接用于YOLOv5/v7/v8/v9/v10/v11等主流版本的模型训练、验证与测试。压缩包共含1666个文件&…

2026/9/23 23:17:40 阅读更多 →
黑翅鸢算法优化CNN-BiLSTM-Attention的客流量预测实战

黑翅鸢算法优化CNN-BiLSTM-Attention的客流量预测实战

简介:这是一份基于黑翅鸢算法BKA-CNN-BiLSTM-Attention的客流量预测Matlab实现,面向计算机、电子信息工程、数学等专业的学生,可用于课程设计、期末大作业与毕业设计。代码采用参数化编程,注释清晰,附赠可直接运行的案…

2026/9/23 23:17:40 阅读更多 →
CNV数据契约验证实战:从接口治理到微服务稳定性提升

CNV数据契约验证实战:从接口治理到微服务稳定性提升

1. 从一次深夜告警说起:CNV到底是什么凌晨两点,监控大盘突然弹出一片红点,某个核心服务的响应时间从80毫秒飙到3秒,错误率突破15%。登录跳板机查日志,发现大量请求在调用下游接口时超时,但下游服务的监控指…

2026/9/23 23:17:40 阅读更多 →
ABB机器人视觉引导抓取:Socket通讯与四元数姿态解析实战

ABB机器人视觉引导抓取:Socket通讯与四元数姿态解析实战

简介:这份文档面向使用ABB机器人进行视觉集成的工程师与学习者,聚焦机器人与相机之间通过socket通讯完成数据交换与坐标转化的完整实现思路。内容围绕socket连接的建立与收发数据、字符串关键信息的提取,以及提取结果与机器人点位数据的转化三…

2026/9/23 23:17:40 阅读更多 →
DilateFormer:面向小目标识别的稀疏扩张注意力模型

DilateFormer:面向小目标识别的稀疏扩张注意力模型

简介:本资源是一份面向深度学习初学者与计算机视觉实践者的DilateFormer模型实战项目,聚焦图像分类任务落地,特别适配植物幼苗等细粒度分类场景。资源包含基于dilateformer_tiny模型的完整训练与推理代码、预处理脚本、配置文件及1987张植物幼…

2026/9/23 23:17:40 阅读更多 →
Java五子棋课程设计实战:Swing界面、二维数组与胜负判定

Java五子棋课程设计实战:Swing界面、二维数组与胜负判定

简介:一份基于 Java 的五子棋对战系统课程设计源码,适合 Java 学习者、高校学生及需要完成课设或实战练手的开发者参考,覆盖了从游戏初始化、玩家操作处理到胜负判断的完整流程。资源共 290 个文件、18.26MB,核心为 17 个 Java 源…

2026/9/23 23:16:40 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →