wrapTextField method
包装并返回一个安全版本的输入框组件。
使用方式:将任意一个已存在的 TextField 实例传入,系统将提取其关键配置项(如 controller、obscureText、decoration 等), 并封装成具备 SQL 注入防护、焦点监听、表单验证能力的 TextFormField。
参数说明:
field
:传入原始的 TextField(只使用其配置,不直接渲染该组件)validator
:可选,自定义表单验证函数。若为空,则默认启用 SQL 注入模式识别。messageForViolation
:可选,定义 SQL 注入命中时返回的错误提示信息,默认提示为"检测到非法操作,请停止尝试注入攻击!"
preventScreenshot
:可选,是否开启屏幕截图与录屏防护功能。默认启用(true)。
推荐使用方式
usage
SecureInput().wrapTextField(
TextField(
controller: controller,
obscureText: true,
decoration: InputDecoration(labelText: "密码"),
),
);
注意:
- 该方法不会直接修改原始 TextField,也不会复用该组件,仅提取其参数进行安全封装。
- 若 field.controller 为空,使用该方法将抛出运行时异常。
Implementation
Widget wrapTextField(
TextField field, {
String? Function(String?)? validator,
String? messageForViolation = "检测到非法操作,请停止尝试注入攻击!",
bool? preventScreenshot = true,
}) {
// 可选开启截图与录屏防护(异步方式,在生命周期外执行)
if (preventScreenshot == true) {
NoScreenshot.instance.screenshotOn();
}
return Listener(
// 点击空白区域时,自动取消输入框焦点(提升 UX 体验)
onPointerDown: (_) => FocusManager.instance.primaryFocus?.unfocus(),
child: AbsorbPointer(
absorbing: false, // 明确设置为可交互(否则将阻止用户输入)
child: SecureInputField(
controller: field.controller!, // 强依赖 controller,需确保已绑定
obscureText: field.obscureText,
decoration: field.decoration,
keyboardType: field.keyboardType,
validator: validator ??
(input) {
return _validator(
input,
messageForViolation: messageForViolation,
);
},
),
),
);
}