
到目前为止,你已经掌握了:
但是大多数 App 都需要收集用户输入:登录表单、评论、搜索等。 本篇我们将学习 TextField、表单校验与提交。
TextField(
decoration: InputDecoration(
labelText: '用户名',
hintText: '请输入用户名',
border: OutlineInputBorder(),
),
)
📌 说明:
decoration → 输入框样式labelText → 标签hintText → 提示文字border → 边框样式属性 | 功能 |
|---|---|
controller | 获取 / 设置输入内容 |
keyboardType | 键盘类型(TextInputType.emailAddress / number) |
obscureText | 密码模式(隐藏输入) |
maxLength | 最大输入长度 |
onChanged | 内容变化回调 |
onSubmitted | 提交回调(按回车 / 完成) |
final TextEditingController _usernameController = TextEditingController();
TextField(
controller: _usernameController,
decoration: InputDecoration(labelText: '用户名'),
),
_usernameController.text_usernameController.clear()@override
void dispose() {
_usernameController.dispose();
super.dispose();
}
final _formKey = GlobalKey<FormState>();
Form(
key: _formKey,
child: Column(
children: [
TextFormField(
decoration: InputDecoration(labelText: '用户名'),
validator: (value) {
if (value == null || value.isEmpty) {
return '用户名不能为空';
}
return null;
},
),
TextFormField(
decoration: InputDecoration(labelText: '密码'),
obscureText: true,
validator: (value) {
if (value == null || value.length < 6) {
return '密码至少6位';
}
return null;
},
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
// 校验通过
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('提交成功')),
);
}
},
child: Text('提交'),
),
],
),
)
📌 功能解析:
GlobalKey<FormState> → 控制 Formvalidator → 校验函数,返回字符串表示错误信息validate() → 校验整个表单,全部通过返回 truevalue == null || value.isEmptyvalue.length < xvalidator: (value) {
if (!RegExp(r'^\w+@\w+\.\w+$').hasMatch(value!)) {
return '请输入正确邮箱';
}
return null;
}
if (_formKey.currentState!.validate()) {
final username = _usernameController.text;
final password = _passwordController.text;
print('用户名: $username, 密码: $password');
// 发送网络请求或本地处理
}
📌 提交逻辑:
validate() 校验❌ TextField 没有 controller → 无法获取输入 ❌ TextFormField 没有 Form 包裹 → validator 无效 ❌ GlobalKey未定义 → validate 调用报错 ❌ 校验逻辑写在 onChanged → 每输入一次触发,不推荐
📌 建议:
你已经学会:
📌 到这里为止:
你的 App 已经可以收集用户输入并进行表单校验和提交了 ✅
TextField 输入 TextEditingController 管理内容 Form + TextFormField 校验 表单提交 + SnackBar 提示 App 用户交互完整
🔜 下一篇预告
《Flutter 零基础入门(四十六):高级列表与滚动优化 —— Sliver 与长列表性能实战》
下一篇我们将学习:
🚀 让你的 App 列表展示更加流畅和专业