首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flutter 零基础入门(四十五):表单与输入控件 —— TextField、表单校验与提交实战

Flutter 零基础入门(四十五):表单与输入控件 —— TextField、表单校验与提交实战

作者头像
LarryLan
发布2026-03-30 18:04:15
发布2026-03-30 18:04:15
980
举报

表单与输入控件 —— TextField、表单校验与提交实战

到目前为止,你已经掌握了:

  • 多页面 App 架构与导航(TabBar / BottomNavigationBar / 命名路由)
  • 列表刷新与分页
  • 动画基础(隐式动画 / 显式动画 / 页面过渡)
  • App 美化(主题、颜色、字体)
  • 图标与图片资源管理

但是大多数 App 都需要收集用户输入:登录表单、评论、搜索等。 本篇我们将学习 TextField、表单校验与提交


一、TextField 基础

代码语言:javascript
复制
TextField(
  decoration: InputDecoration(
    labelText: '用户名',
    hintText: '请输入用户名',
    border: OutlineInputBorder(),
  ),
)

📌 说明:

  • decoration → 输入框样式
  • labelText → 标签
  • hintText → 提示文字
  • border → 边框样式

1️⃣ 常用属性

属性

功能

controller

获取 / 设置输入内容

keyboardType

键盘类型(TextInputType.emailAddress / number)

obscureText

密码模式(隐藏输入)

maxLength

最大输入长度

onChanged

内容变化回调

onSubmitted

提交回调(按回车 / 完成)


二、使用 TextEditingController

代码语言:javascript
复制
final TextEditingController _usernameController = TextEditingController();

TextField(
  controller: _usernameController,
  decoration: InputDecoration(labelText: '用户名'),
),
  • 获取输入内容:_usernameController.text
  • 清空输入内容:_usernameController.clear()
  • 记得在 StatefulWidget 的 dispose 中释放:
代码语言:javascript
复制
@override
void dispose() {
  _usernameController.dispose();
  super.dispose();
}

三、Form 与表单校验

1️⃣ Form + TextFormField

代码语言:javascript
复制
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> → 控制 Form
  • validator → 校验函数,返回字符串表示错误信息
  • validate() → 校验整个表单,全部通过返回 true

2️⃣ 表单校验技巧

  • 必填字段 → value == null || value.isEmpty
  • 最小长度 → value.length < x
  • 正则校验 → 邮箱 / 手机号:
代码语言:javascript
复制
validator: (value) {
  if (!RegExp(r'^\w+@\w+\.\w+$').hasMatch(value!)) {
    return '请输入正确邮箱';
  }
  return null;
}

四、提交表单与获取输入内容

代码语言:javascript
复制
if (_formKey.currentState!.validate()) {
  final username = _usernameController.text;
  final password = _passwordController.text;

  print('用户名: $username, 密码: $password');
  // 发送网络请求或本地处理
}

📌 提交逻辑:

  1. 调用 validate() 校验
  2. 校验通过 → 获取内容 → 执行业务逻辑

五、常见坑

❌ TextField 没有 controller → 无法获取输入 ❌ TextFormField 没有 Form 包裹 → validator 无效 ❌ GlobalKey未定义 → validate 调用报错 ❌ 校验逻辑写在 onChanged → 每输入一次触发,不推荐

📌 建议:

  • 表单校验统一使用 TextFormField + Form
  • 控制器统一在 StatefulWidget 内管理
  • 校验函数简洁清晰

六、本篇你真正掌握了什么?

你已经学会:

  • TextField 输入控件基本用法
  • TextEditingController 获取和管理输入内容
  • Form + TextFormField 表单校验
  • 提交表单与业务逻辑处理
  • 校验必填、长度、正则等常用规则

📌 到这里为止:

你的 App 已经可以收集用户输入并进行表单校验和提交了


七、一句话总结

TextField 输入 TextEditingController 管理内容 Form + TextFormField 校验 表单提交 + SnackBar 提示 App 用户交互完整


🔜 下一篇预告

《Flutter 零基础入门(四十六):高级列表与滚动优化 —— Sliver 与长列表性能实战》

下一篇我们将学习:

  • ListView.builder 高性能长列表
  • Sliver 系列组件基础
  • 滚动监听与分页加载
  • 高性能列表和滚动优化技巧

🚀 让你的 App 列表展示更加流畅和专业

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Larry的Hub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 表单与输入控件 —— TextField、表单校验与提交实战
    • 一、TextField 基础
      • 1️⃣ 常用属性
    • 二、使用 TextEditingController
    • 三、Form 与表单校验
      • 1️⃣ Form + TextFormField
      • 2️⃣ 表单校验技巧
    • 四、提交表单与获取输入内容
    • 五、常见坑
    • 六、本篇你真正掌握了什么?
    • 七、一句话总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档