Flutter TextFormField 完全手册与筹划最佳实践

[复制链接]
发表于 2025-10-10 07:29:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
1. 弁言
2. TextFormField 的根本用法
3. 紧张属性
4. 自界说 TextFormField 样式
4.1 设置边框样式
4.2 设置输入格式限定
4.3 多行输入
5. 结论
干系保举


1. 弁言

        在 Flutter 中,TextFormField 是 TextField 的扩展版本,专为表单输入筹划。它除了继续 TextField 的全部功能外,还提供了输入验证、表单状态管理等功能,使其成为表单输入的最佳选择。本文将先容 TextFormField 的根本用法、紧张属性及自界说样式。
2. TextFormField 的根本用法

    TextFormField 必要与 Form 组件一起利用,并通过 GlobalKey<FormState> 举行表单状态管理。
  1. final _formKey = GlobalKey<FormState>();
  2. Form(
  3.   key: _formKey,
  4.   child: Column(
  5.     children: [
  6.       TextFormField(
  7.         decoration: InputDecoration(labelText: '用户名'),
  8.         validator: (value) {
  9.           if (value == null || value.isEmpty) {
  10.             return '请输入用户名';
  11.           }
  12.           return null;
  13.         },
  14.       ),
  15.       ElevatedButton(
  16.         onPressed: () {
  17.           if (_formKey.currentState!.validate()) {
  18.             print('表单验证通过');
  19.           }
  20.         },
  21.         child: Text('提交'),
  22.       ),
  23.     ],
  24.   ),
  25. )
复制代码
3. 紧张属性

属性分析controller获取和控制输入框的内容decoration自界说输入框表面,如边框、标签等keyboardType设置键盘范例(文本、数字、邮箱等)obscureText是否隐蔽输入内容(暗码输入)validator用于验证输入内容是否正当onSaved表单提交时生存输入值 示例:
  1. TextFormField(
  2.   decoration: InputDecoration(hintText: '请输入密码'),
  3.   obscureText: true,
  4.   validator: (value) {
  5.     if (value == null || value.length < 6) {
  6.       return '密码长度至少为6位';
  7.     }
  8.     return null;
  9.   },
  10. )
复制代码
4. 自界说 TextFormField 样式

4.1 设置边框样式

  1. TextFormField(
  2.   decoration: InputDecoration(
  3.     border: OutlineInputBorder(),
  4.     labelText: '邮箱',
  5.   ),
  6. )
复制代码
4.2 设置输入格式限定

  1. TextFormField(
  2.   keyboardType: TextInputType.number,
  3.   inputFormatters: [FilteringTextInputFormatter.digitsOnly],
  4. )
复制代码
4.3 多行输入

  1. TextFormField(
  2.   maxLines: 5,
  3.   decoration: InputDecoration(labelText: '留言'),
  4. )
复制代码
5. 结论

    TextFormField 是 Flutter 中用于表单输入的加强版 TextField,支持输入验证、状态管理等功能,实用于用户注册、登录等场景。联合 Form 组件,可实现完备的表单交互,进步应用的可用性。一个完备的注册页面代码如下:
  1. import 'package:flutter/material.dart';
  2. class ScRegisterPage extends StatefulWidget {
  3.   @override
  4.   _ScRegisterPageState createState() => _ScRegisterPageState();
  5. }
  6. class _ScRegisterPageState extends State<ScRegisterPage> {
  7.   final _formKey = GlobalKey<FormState>();
  8.   final _scaffoldKey = GlobalKey<ScaffoldState>();
  9.   FocusNode _userNameNode = new FocusNode();
  10.   FocusNode _pwdNode = new FocusNode();
  11.   FocusNode _pwd2Node = new FocusNode();
  12.   late String _username,_pwd,_pwd2;
  13.   @override
  14.   Widget build(BuildContext context) {
  15.     return Scaffold(
  16.       key: _scaffoldKey,
  17.       appBar: AppBar(
  18.         title: Text("注册"),
  19.       ),
  20.       //Form
  21.       body: Form(
  22.           key: _formKey,
  23.           child: ListView(
  24.             // 输入框会弹出软键盘,所以加个滑动的View
  25.             padding: EdgeInsets.fromLTRB(22.0, 18.0, 22.0, 0.0),
  26.             children: <Widget>[
  27.               _buildUserName(),
  28.               _buildPwd(),
  29.               _buildPwd2(),
  30.               _buildRegister(),
  31.             ],
  32.           )),
  33.     );
  34.   }
  35.   Widget _buildUserName() {
  36.     return TextFormField(
  37.       focusNode: _userNameNode,
  38.       //以用户名输入框 为默认焦点,则进入页面会自动弹出软键盘
  39.       autofocus: true,
  40.       decoration: InputDecoration(
  41.         labelText: "用户名",
  42.       ),
  43.       //  如键盘动作类型
  44.       textInputAction: TextInputAction.next,
  45.       onEditingComplete: () {
  46.         //按下action 的响应
  47.         FocusScope.of(context).requestFocus(_pwdNode);
  48.       },
  49.       //校验
  50.       validator: (value) {
  51.         if (value!.trim().isEmpty) {
  52.           //错误提示
  53.           return "请输入用户名";
  54.         }
  55.         _username = value;
  56.       },
  57.     );
  58.   }
  59.   Widget _buildPwd() {
  60.     return TextFormField(
  61.       focusNode: _pwdNode,
  62.       //以用户名输入框 为默认焦点,则进入页面会自动弹出软键盘
  63.       autofocus: true,
  64.       decoration: InputDecoration(
  65.         labelText: "密码",
  66.       ),
  67.       //  如键盘动作类型
  68.       textInputAction: TextInputAction.next,
  69.       onEditingComplete: () {
  70.         //按下action 的响应
  71.         FocusScope.of(context).requestFocus(_pwd2Node);
  72.       },
  73.       //校验
  74.       validator: (value) {
  75.         if (value!.trim().isEmpty) {
  76.           //错误提示
  77.           return "请输入密码";
  78.         }
  79.         _pwd = value;
  80.       },
  81.     );
  82.   }
  83.   Widget _buildPwd2() {
  84.     return TextFormField(
  85.       focusNode: _pwd2Node,
  86.       //以用户名输入框 为默认焦点,则进入页面会自动弹出软键盘
  87.       autofocus: true,
  88.       decoration: InputDecoration(
  89.         labelText: "确认密码",
  90.       ),
  91.       //  如键盘动作类型
  92.       textInputAction: TextInputAction.go,
  93.       onEditingComplete: () {
  94.         //按下action 的响应
  95.         _click();
  96.       },
  97.       //校验
  98.       validator: (value) {
  99.         if (value!.trim().isEmpty) {
  100.           //错误提示
  101.           return "请确认密码";
  102.         }
  103.         if(_pwd != value){
  104.           return "两次密码输入不一致";
  105.         }
  106.         _pwd2 = value;
  107.       },
  108.     );
  109.   }
  110.   Widget _buildRegister() {
  111.     ///Container:装饰性容器
  112.     return Container(
  113.       height: 52.0,
  114.       margin: EdgeInsets.only(top: 18.0),
  115.       child: ElevatedButton(
  116.         style: ElevatedButton.styleFrom(
  117.           foregroundColor: Colors.white, // 文字颜色
  118.           backgroundColor:Theme.of(context).primaryColor, // 背景色
  119.         ),
  120.         onPressed: _click,
  121.         child: Text(
  122.           "注册",
  123.           style: TextStyle(color: Colors.white, fontSize: 18.0),
  124.         ),
  125.       ),
  126.     );
  127.   }
  128.   _click() async{
  129.     //点击注册按钮 让软键盘隐藏
  130.     _userNameNode.unfocus();
  131.     _pwdNode.unfocus();
  132.     _pwd2Node.unfocus();
  133.     //校验输入内容
  134.     if (_formKey.currentState!.validate()) {
  135.       //弹出一个加载框
  136.       // barrierDismissible: 不允许按返回dismiss
  137.       showDialog(context: context,barrierDismissible: false,builder: (_){
  138.         return Center(child: CircularProgressIndicator(),);
  139.       });
  140.       //可以调用后端接口去注册了
  141.       // var result =  await SccApi.register(_username,_pwd);
  142.       // //对话框dismiss
  143.       // Navigator.pop(context);
  144.       // if(result['errorCode'] == -1){
  145.       //   var error = result['errorMsg'];
  146.       //   //弹出提示
  147.       //   // Toast.show(error, context,gravity: Toast.CENTER);
  148.       // }else{
  149.       //   //Toast.show("注册成功!", context,gravity: Toast.CENTER);
  150.       //   Navigator.pop(context);
  151.       // }
  152.     }
  153.   }
  154. }
复制代码

干系保举

Flutter 按钮组件 ElevatedButton 详解-CSDN博客文章欣赏阅读1.1k次,点赞25次,收藏29次。本文具体形貌 ElevatedButton 是 Flutter 中常见的按钮组件,实用于夸大操纵。通过 style 属性可以机动地修改配景致、外形、巨细等。把握 ElevatedButton 的利用可以资助开发者创建更雅观的交互界面。_flutter button 组件

Flutter TextField 从入门到夺目:把握输入框的完备指南-CSDN博客文章欣赏阅读652次,点赞35次,收藏25次。本文全面剖析 Flutter TextField 控件的利用本领,覆盖从底子到进阶的完备知识体系。入门部门讲授底子属性(controller、decoration)、键盘范例设置和文本监听;进阶部门深入探究表单验证(Form+TextFormField)、自界说输入格式(正则表达式验证)、动态样式修改(圆角/图标/动画)以及高级功能(输入长度限定、防抖处置惩罚)。通过代码示例演示手机号输入验证、暗码隐蔽切换、输入掩码等实战场景,并提供多平台适配、性能优化和无停滞访问等最佳实践方案。
 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表