wrapTextField method

Widget wrapTextField(
  1. TextField field, {
  2. String? validator(
    1. String?
    )?,
  3. String? messageForViolation = "检测到非法操作,请停止尝试注入攻击!",
  4. bool? preventScreenshot = true,
})

包装并返回一个安全版本的输入框组件。

使用方式:将任意一个已存在的 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,
              );
            },
      ),
    ),
  );
}