TextField

0 阅读2分钟

带标签的 TextField

TextField(
  decoration: InputDecoration(
    labelText: '用户名',
    hintText: '请输入用户名',
  ),
)

获取输入值

// 方式1:使用 TextEditingController
final TextEditingController _controller = TextEditingController();

TextField(
  controller: _controller,
)

// 获取值
print(_controller.text);

// 方式2:使用 onChanged 回调
TextField(
  onChanged: (value) {
    print('当前输入: $value');
  },
)

decoration - 装饰属性

TextField(
  decoration: InputDecoration(
    // 标签文本
    labelText: '邮箱',
    // 提示文本
    hintText: '请输入邮箱地址',
    // 前缀图标
    prefixIcon: Icon(Icons.email),
    // 后缀图标
    suffixIcon: IconButton(
      icon: Icon(Icons.clear),
      onPressed: () {
        _controller.clear();
      },
    ),
    // 边框样式
    border: OutlineInputBorder(
      borderRadius: BorderRadius.circular(10.0),
    ),
    // 填充颜色
    filled: true,
    fillColor: Colors.grey[100],
    // 错误文本
    errorText: _isEmailValid ? null : '邮箱格式不正确',
  ),
)

keyboardType - 键盘类型

TextField(
  keyboardType: TextInputType.emailAddress, // 邮箱键盘
  // 其他类型:
  // TextInputType.text - 普通文本
  // TextInputType.number - 数字
  // TextInputType.phone - 电话
  // TextInputType.multiline - 多行文本
)

输入控制

class TextFieldControllerExample extends StatefulWidget {
  @override
  _TextFieldControllerExampleState createState() => _TextFieldControllerExampleState();
}

class _TextFieldControllerExampleState extends State<TextFieldControllerExample> {
  final TextEditingController _controller = TextEditingController();
  String _inputText = '';

  @override
  void initState() {
    super.initState();
    // 监听文本变化
    _controller.addListener(() {
      setState(() {
        _inputText = _controller.text;
      });
    });
    
    // 设置初始值
    _controller.text = '初始文本';
  }

  @override
  void dispose() {
    _controller.dispose(); // 必须释放控制器
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextField(
          controller: _controller,
        ),
        Text('输入的内容: $_inputText'),
        ElevatedButton(
          onPressed: () {
            _controller.text = ''; // 清空文本
          },
          child: Text('清空'),
        ),
      ],
    );
  }
}

焦点控制

class FocusExample extends StatefulWidget {
  @override
  _FocusExampleState createState() => _FocusExampleState();
}

class _FocusExampleState extends State<FocusExample> {
  final FocusNode _focusNode1 = FocusNode();
  final FocusNode _focusNode2 = FocusNode();

  @override
  void initState() {
    super.initState();
    // 监听焦点变化
    _focusNode1.addListener(() {
      if (_focusNode1.hasFocus) {
        print('第一个输入框获得焦点');
      }
    });
  }

  @override
  void dispose() {
    _focusNode1.dispose();
    _focusNode2.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextField(
          focusNode: _focusNode1,
          decoration: InputDecoration(labelText: '用户名'),
          textInputAction: TextInputAction.next,
          onSubmitted: (_) {
            // 按下回车后焦点移动到下一个输入框
            FocusScope.of(context).requestFocus(_focusNode2);
          },
        ),
        SizedBox(height: 16),
        TextField(
          focusNode: _focusNode2,
          decoration: InputDecoration(labelText: '密码'),
          textInputAction: TextInputAction.done,
          onSubmitted: (_) {
            // 完成输入,隐藏键盘
            _focusNode2.unfocus();
          },
        ),
      ],
    );
  }
}

样式定制

class CustomTextField extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return TextField(
      style: TextStyle(
        fontSize: 18,
        fontWeight: FontWeight.w500,
        color: Colors.blue[800],
      ),
      decoration: InputDecoration(
        labelText: '自定义样式输入框',
        labelStyle: TextStyle(
          color: Colors.blue,
          fontSize: 16,
        ),
        hintText: '请输入内容',
        hintStyle: TextStyle(
          color: Colors.grey[400],
          fontSize: 14,
        ),
        enabledBorder: OutlineInputBorder(
          borderSide: BorderSide(color: Colors.blue, width: 1.0),
          borderRadius: BorderRadius.circular(8.0),
        ),
        focusedBorder: OutlineInputBorder(
          borderSide: BorderSide(color: Colors.blueAccent, width: 2.0),
          borderRadius: BorderRadius.circular(8.0),
        ),
        errorBorder: OutlineInputBorder(
          borderSide: BorderSide(color: Colors.red, width: 1.0),
          borderRadius: BorderRadius.circular(8.0),
        ),
        focusedErrorBorder: OutlineInputBorder(
          borderSide: BorderSide(color: Colors.red, width: 2.0),
          borderRadius: BorderRadius.circular(8.0),
        ),
        contentPadding: EdgeInsets.symmetric(
          horizontal: 16,
          vertical: 12,
        ),
        prefixIcon: Icon(Icons.person, color: Colors.blue),
        suffixIcon: Icon(Icons.check_circle, color: Colors.green),
        filled: true,
        fillColor: Colors.blue[50],
      ),
    );
  }
}

表单验证

class SingleFieldValidation extends StatefulWidget {
  @override
  _SingleFieldValidationState createState() => _SingleFieldValidationState();
}

class _SingleFieldValidationState extends State<SingleFieldValidation> {
  final _formKey = GlobalKey<FormState>();
  final TextEditingController _emailController = TextEditingController();
  bool _isEmailValid = true;

  String? _validateEmail(String? value) {
    if (value == null || value.isEmpty) {
      return '邮箱不能为空';
    }
    final emailRegex = RegExp(r'^[\w-.]+@([\w-]+.)+[\w-]{2,4}$');
    if (!emailRegex.hasMatch(value)) {
      return '请输入有效的邮箱地址';
    }
    return null;
  }

  void _submitForm() {
    if (_formKey.currentState!.validate()) {
      // 表单验证通过
      print('邮箱: ${_emailController.text}');
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('表单提交成功')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: [
          TextFormField(
            controller: _emailController,
            decoration: InputDecoration(
              labelText: '邮箱',
              hintText: 'example@domain.com',
              errorText: _isEmailValid ? null : '邮箱格式不正确',
            ),
            keyboardType: TextInputType.emailAddress,
            validator: _validateEmail,
            onChanged: (value) {
              setState(() {
                _isEmailValid = _validateEmail(value) == null;
              });
            },
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _submitForm,
            child: Text('提交'),
          ),
        ],
      ),
    );
  }
}
### 多字段表单验证

class MultiFieldForm extends StatefulWidget { @override _MultiFieldFormState createState() => _MultiFieldFormState(); }

class _MultiFieldFormState extends State { final _formKey = GlobalKey(); final TextEditingController _nameController = TextEditingController(); final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); bool _obscurePassword = true;

@override Widget build(BuildContext context) { return Form( key: _formKey, child: Column( children: [ TextFormField( controller: _nameController, decoration: InputDecoration( labelText: '姓名', hintText: '请输入您的姓名', prefixIcon: Icon(Icons.person), ), validator: (value) { if (value == null || value.isEmpty) { return '姓名不能为空'; } if (value.length < 2) { return '姓名至少2个字符'; } return null; }, ), SizedBox(height: 16), TextFormField( controller: _emailController, decoration: InputDecoration( labelText: '邮箱', hintText: 'example@domain.com', prefixIcon: Icon(Icons.email), ), keyboardType: TextInputType.emailAddress, validator: (value) { if (value == null || value.isEmpty) { return '邮箱不能为空'; } final emailRegex = RegExp(r'^[\w-.]+@([\w-]+.)+[\w-]{2,4}'); if (!emailRegex.hasMatch(value)) { return '请输入有效的邮箱地址'; } return null; }, ), SizedBox(height: 16), TextFormField( controller: _passwordController, decoration: InputDecoration( labelText: '密码', hintText: '至少6个字符', prefixIcon: Icon(Icons.lock), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility : Icons.visibility_off, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), obscureText: _obscurePassword, validator: (value) { if (value == null || value.isEmpty) { return '密码不能为空'; } if (value.length < 6) { return '密码至少6个字符'; } return null; }, ), SizedBox(height: 24), ElevatedButton( onPressed: () { if (_formKey.currentState!.validate()) { // 表单验证通过 print('姓名: {_nameController.text}'); print('邮箱: emailController.text);print(密码:{_emailController.text}'); print('密码: {_passwordController.text}');

            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                content: Text('注册成功'),
                backgroundColor: Colors.green,
              ),
            );
          }
        },
        child: Text('注册'),
        style: ElevatedButton.styleFrom(
          minimumSize: Size(double.infinity, 50),
        ),
      ),
    ],
  ),
);

} }

### 如何隐藏键盘?
    ```
FocusScope.of(context).unfocus();

// 方法2:使用 FocusNode
_focusNode.unfocus();
###  如何设置默认值?
```

// 在初始化时设置 final TextEditingController _controller = TextEditingController();

@override void initState() { super.initState(); _controller.text = '默认值'; }

// 或者直接设置 _controller.text = '新值';

    ### 如何监听文本变化

// 方法1:使用 addListener _controller.addListener(() { print('文本变化: ${_controller.text}'); });

// 方法2:使用 onChanged TextField( onChanged: (value) { print('文本变化: $value'); }, )