Widgets

InputField

简介

InputField 组件是 Nylo Website 的增强文本字段,内置支持:

  • 带有可自定义错误消息的验证
  • 密码可见性切换
  • 输入掩码(电话号码、信用卡等)
  • 头部和底部组件
  • 可清除输入
  • 状态管理集成
  • 用于开发的模拟数据

基本用法

final TextEditingController _controller = TextEditingController();

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: SafeArea(
      child: Padding(
        padding: EdgeInsets.all(16),
        child: InputField(
          controller: _controller,
          labelText: "Username",
          hintText: "Enter your username",
        ),
      ),
    ),
  );
}

验证

使用 formValidator 参数添加验证规则:

InputField(
  controller: _controller,
  labelText: "Email",
  formValidator: FormValidator.rule("email|not_empty"),
  validateOnFocusChange: true,
)

当用户将焦点移开时,字段将进行验证。

自定义验证处理程序

以编程方式处理验证错误:

InputField(
  controller: _controller,
  labelText: "Username",
  formValidator: FormValidator.rule("not_empty|min:3"),
  handleValidationError: (FormValidationResult result) {
    if (!result.isValid) {
      print("Error: ${result.getFirstErrorMessage()}");
    }
  },
)

查看验证文档了解所有可用的验证规则。

InputField.password

预配置的密码字段,带有文本隐藏和可见性切换:

final TextEditingController _passwordController = TextEditingController();

InputField.password(
  controller: _passwordController,
  labelText: "Password",
  formValidator: FormValidator.rule("not_empty|min:8"),
)

自定义密码可见性

InputField.password(
  controller: _passwordController,
  passwordVisible: true, // Show/hide toggle icon
  passwordViewable: true, // Allow user to toggle visibility
)

InputField.emailAddress

预配置的邮箱字段,带有邮箱键盘和自动聚焦:

final TextEditingController _emailController = TextEditingController();

InputField.emailAddress(
  controller: _emailController,
  formValidator: FormValidator.rule("email|not_empty"),
)

InputField.capitalizeWords

自动将每个单词的首字母大写:

final TextEditingController _nameController = TextEditingController();

InputField.capitalizeWords(
  controller: _nameController,
  labelText: "Full Name",
)

输入掩码

为格式化数据(如电话号码或信用卡)应用输入掩码:

// Phone number mask
InputField(
  controller: _phoneController,
  labelText: "Phone Number",
  mask: "(###) ###-####",
  maskMatch: r'[0-9]',
  maskedReturnValue: false, // Returns unmasked value: 1234567890
)

// Credit card mask
InputField(
  controller: _cardController,
  labelText: "Card Number",
  mask: "#### #### #### ####",
  maskMatch: r'[0-9]',
  maskedReturnValue: true, // Returns masked value: 1234 5678 9012 3456
)
参数 描述
mask 使用 # 作为占位符的掩码模式
maskMatch 有效输入字符的正则表达式
maskedReturnValue 如果为 true,返回格式化的值;如果为 false,返回原始输入

头部和底部

在输入字段的上方或下方添加组件:

InputField(
  controller: _controller,
  labelText: "Bio",
  header: Text(
    "Tell us about yourself",
    style: TextStyle(fontWeight: FontWeight.bold),
  ),
  footer: Text(
    "Max 200 characters",
    style: TextStyle(color: Colors.grey, fontSize: 12),
  ),
  maxLength: 200,
)

可清除输入

添加清除按钮以快速清空字段:

InputField(
  controller: _searchController,
  labelText: "Search",
  clearable: true,
  clearIcon: Icon(Icons.close, size: 20), // Custom clear icon
  onChanged: (value) {
    // Handle search
  },
)

状态管理

为输入字段指定状态名称以编程方式控制它:

InputField(
  controller: _controller,
  labelText: "Username",
  stateName: "username_field",
)

状态操作

// Clear the field
InputField.stateActions("username_field").clear();

// Set a value
updateState("username_field", data: {
  "action": "setValue",
  "value": "new_value"
});

参数

通用参数

参数 类型 默认值 描述
controller TextEditingController 必需 控制正在编辑的文本
labelText String? - 字段上方显示的标签
hintText String? - 占位文本
formValidator FormValidator? - 验证规则
validateOnFocusChange bool true 焦点变化时验证
obscureText bool false 隐藏输入(用于密码)
keyboardType TextInputType text 键盘类型
autoFocus bool false 构建时自动聚焦
readOnly bool false 使字段只读
enabled bool? - 启用/禁用字段
maxLines int? 1 最大行数
maxLength int? - 最大字符数

样式参数

参数 类型 描述
backgroundColor Color? 字段背景颜色
borderRadius BorderRadius? 边框圆角
border InputBorder? 默认边框
focusedBorder InputBorder? 聚焦时的边框
enabledBorder InputBorder? 启用时的边框
contentPadding EdgeInsetsGeometry? 内部填充
style TextStyle? 文本样式
labelStyle TextStyle? 标签文本样式
hintStyle TextStyle? 提示文本样式
prefixIcon Widget? 输入前的图标

掩码参数

参数 类型 描述
mask String? 掩码模式(例如 "###-####")
maskMatch String? 有效字符的正则表达式
maskedReturnValue bool? 返回掩码值还是原始值

功能参数

参数 类型 描述
header Widget? 字段上方的组件
footer Widget? 字段下方的组件
clearable bool? 显示清除按钮
clearIcon Widget? 自定义清除图标
passwordVisible bool? 显示密码切换
passwordViewable bool? 允许密码可见性切换
dummyData String? 用于开发的模拟数据
stateName String? 状态管理名称
onChanged Function(String)? 值变化时调用