Flutter TextFormField 完全手冊與設計最佳實踐

目錄

1. 引言

2. TextFormField 的基本用法

3. 主要屬性

4. 自定義 TextFormField 樣式

4.1 設置邊框樣式

4.2 設置輸入格式限制

4.3 多行輸入

5. 結論

相關推薦


1. 引言

????????在 Flutter 中,TextFormFieldTextField 的擴展版本,專為表單輸入設計。它除了繼承 TextField 的所有功能外,還提供了輸入驗證、表單狀態管理等功能,使其成為表單輸入的最佳選擇。本文將介紹 TextFormField 的基本用法、主要屬性及自定義樣式。

2. TextFormField 的基本用法

? ? TextFormField 需要與 Form 組件一起使用,并通過 GlobalKey<FormState> 進行表單狀態管理。

final _formKey = GlobalKey<FormState>();Form(key: _formKey,child: Column(children: [TextFormField(decoration: InputDecoration(labelText: '用戶名'),validator: (value) {if (value == null || value.isEmpty) {return '請輸入用戶名';}return null;},),ElevatedButton(onPressed: () {if (_formKey.currentState!.validate()) {print('表單驗證通過');}},child: Text('提交'),),],),
)

3. 主要屬性

屬性說明
controller獲取和控制輸入框的內容
decoration自定義輸入框外觀,如邊框、標簽等
keyboardType設置鍵盤類型(文本、數字、郵箱等)
obscureText是否隱藏輸入內容(密碼輸入)
validator用于驗證輸入內容是否合法
onSaved表單提交時保存輸入值

示例:

TextFormField(decoration: InputDecoration(hintText: '請輸入密碼'),obscureText: true,validator: (value) {if (value == null || value.length < 6) {return '密碼長度至少為6位';}return null;},
)

4. 自定義 TextFormField 樣式

4.1 設置邊框樣式

TextFormField(decoration: InputDecoration(border: OutlineInputBorder(),labelText: '郵箱',),
)

4.2 設置輸入格式限制

TextFormField(keyboardType: TextInputType.number,inputFormatters: [FilteringTextInputFormatter.digitsOnly],
)

4.3 多行輸入

TextFormField(maxLines: 5,decoration: InputDecoration(labelText: '留言'),
)

5. 結論

? ? TextFormField 是 Flutter 中用于表單輸入的增強版 TextField,支持輸入驗證、狀態管理等功能,適用于用戶注冊、登錄等場景。結合 Form 組件,可實現完整的表單交互,提高應用的可用性。一個完整的注冊頁面代碼如下:

import 'package:flutter/material.dart';class ScRegisterPage extends StatefulWidget {@override_ScRegisterPageState createState() => _ScRegisterPageState();
}class _ScRegisterPageState extends State<ScRegisterPage> {final _formKey = GlobalKey<FormState>();final _scaffoldKey = GlobalKey<ScaffoldState>();FocusNode _userNameNode = new FocusNode();FocusNode _pwdNode = new FocusNode();FocusNode _pwd2Node = new FocusNode();late String _username,_pwd,_pwd2;@overrideWidget build(BuildContext context) {return Scaffold(key: _scaffoldKey,appBar: AppBar(title: Text("注冊"),),//Formbody: Form(key: _formKey,child: ListView(// 輸入框會彈出軟鍵盤,所以加個滑動的Viewpadding: EdgeInsets.fromLTRB(22.0, 18.0, 22.0, 0.0),children: <Widget>[_buildUserName(),_buildPwd(),_buildPwd2(),_buildRegister(),],)),);}Widget _buildUserName() {return TextFormField(focusNode: _userNameNode,//以用戶名輸入框 為默認焦點,則進入頁面會自動彈出軟鍵盤autofocus: true,decoration: InputDecoration(labelText: "用戶名",),//  如鍵盤動作類型textInputAction: TextInputAction.next,onEditingComplete: () {//按下action 的響應FocusScope.of(context).requestFocus(_pwdNode);},//校驗validator: (value) {if (value!.trim().isEmpty) {//錯誤提示return "請輸入用戶名";}_username = value;},);}Widget _buildPwd() {return TextFormField(focusNode: _pwdNode,//以用戶名輸入框 為默認焦點,則進入頁面會自動彈出軟鍵盤autofocus: true,decoration: InputDecoration(labelText: "密碼",),//  如鍵盤動作類型textInputAction: TextInputAction.next,onEditingComplete: () {//按下action 的響應FocusScope.of(context).requestFocus(_pwd2Node);},//校驗validator: (value) {if (value!.trim().isEmpty) {//錯誤提示return "請輸入密碼";}_pwd = value;},);}Widget _buildPwd2() {return TextFormField(focusNode: _pwd2Node,//以用戶名輸入框 為默認焦點,則進入頁面會自動彈出軟鍵盤autofocus: true,decoration: InputDecoration(labelText: "確認密碼",),//  如鍵盤動作類型textInputAction: TextInputAction.go,onEditingComplete: () {//按下action 的響應_click();},//校驗validator: (value) {if (value!.trim().isEmpty) {//錯誤提示return "請確認密碼";}if(_pwd != value){return "兩次密碼輸入不一致";}_pwd2 = value;},);}Widget _buildRegister() {///Container:裝飾性容器return Container(height: 52.0,margin: EdgeInsets.only(top: 18.0),child: ElevatedButton(style: ElevatedButton.styleFrom(foregroundColor: Colors.white, // 文字顏色backgroundColor:Theme.of(context).primaryColor, // 背景色),onPressed: _click,child: Text("注冊",style: TextStyle(color: Colors.white, fontSize: 18.0),),),);}_click() async{//點擊注冊按鈕 讓軟鍵盤隱藏_userNameNode.unfocus();_pwdNode.unfocus();_pwd2Node.unfocus();//校驗輸入內容if (_formKey.currentState!.validate()) {//彈出一個加載框// barrierDismissible: 不允許按返回dismissshowDialog(context: context,barrierDismissible: false,builder: (_){return Center(child: CircularProgressIndicator(),);});//可以調用后端接口去注冊了// var result =  await SccApi.register(_username,_pwd);// //對話框dismiss// Navigator.pop(context);// if(result['errorCode'] == -1){//   var error = result['errorMsg'];//   //彈出提示//   // Toast.show(error, context,gravity: Toast.CENTER);// }else{//   //Toast.show("注冊成功!", context,gravity: Toast.CENTER);//   Navigator.pop(context);// }}}
}

相關推薦

Flutter 按鈕組件 ElevatedButton 詳解-CSDN博客文章瀏覽閱讀1.1k次,點贊25次,收藏29次。本文詳細描述 ElevatedButton 是 Flutter 中常見的按鈕組件,適用于強調操作。通過 style 屬性可以靈活地修改背景色、形狀、大小等。掌握 ElevatedButton 的使用可以幫助開發者創建更美觀的交互界面。_flutter button 組件 https://shuaici.blog.csdn.net/article/details/146067694

Flutter TextField 從入門到精通:掌握輸入框的完整指南-CSDN博客文章瀏覽閱讀652次,點贊35次,收藏25次。本文全面解析 Flutter TextField 控件的使用技巧,覆蓋從基礎到進階的完整知識體系。入門部分講解基礎屬性(controller、decoration)、鍵盤類型設置和文本監聽;進階部分深入探討表單驗證(Form+TextFormField)、自定義輸入格式(正則表達式驗證)、動態樣式修改(圓角/圖標/動畫)以及高級功能(輸入長度限制、防抖處理)。通過代碼示例演示手機號輸入驗證、密碼隱藏切換、輸入掩碼等實戰場景,并提供多平臺適配、性能優化和無障礙訪問等最佳實踐方案。 https://shuaici.blog.csdn.net/article/details/146068520?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74224.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HC-05與HC-06藍牙配對零基礎教程 以及openmv識別及遠程傳輸項目的概述

這個是上一年的項目&#xff0c;之前弄得不怎么完整&#xff0c;只有一個openmv的&#xff0c;所以openmv自己去我主頁找&#xff0c;這篇主要講藍牙 這個是我在使用openmv連接單片機1然后單片機1與單片機2通過藍牙進行通信 最終實現的效果是&#xff1a;openmv識別到圖形和數…

【Docker系列一】Docker 簡介

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

Vue 入門到實戰 五

第5章 過渡與動畫 目錄 5.1 單元素/組件過渡 5.1.1 過渡class 5.1.2 CSS 過渡 5.1.3 CSS 動畫 5.1.4 同時使用過渡和動畫 5.1.5 JavaScript 鉤子方法 5.2 多元素/組件過渡 5.2.1 多元素過渡 5.2.2 多組件過渡 5.3 列表過渡 5.3.1 列表的普通過渡 5.3.2 列表的平滑…

Apache SeaTunnel腳本升級及參數調優實戰

最近作者針對實時數倉的Apache SeaTunnel同步鏈路&#xff0c;完成了雙引擎架構升級與全鏈路參數深度調優&#xff0c;希望本文能夠給大家有所啟發&#xff0c;歡迎批評指正&#xff01; Apache SeaTunnel 版本 &#xff1a;2.3.9 Doris版本&#xff1a;2.0.6 MySQL JDBC Conne…

C++ 時間操作:獲取有史以來的天數與文件計數器

C 時間操作&#xff1a;獲取有史以來的天數與文件計數器 在C中&#xff0c;時間操作是一個非常重要的功能&#xff0c;尤其是在需要處理日期、時間戳或定時任務時。本文將介紹如何利用C的時間操作功能&#xff0c;實現以下兩個目標&#xff1a; 獲取從Unix紀元時間&#xff0…

Python Bug修復案例分析:Python 中常見的 IndentationError 錯誤 bug 的修復

在 Python 編程的世界里&#xff0c;代碼的可讀性和規范性至關重要。Python 通過強制使用縮進來表示代碼塊的層次結構&#xff0c;這一獨特的設計理念使得代碼更加清晰易讀。然而&#xff0c;正是這種對縮進的嚴格要求&#xff0c;導致開發者在編寫代碼時&#xff0c;稍有不慎就…

【論文筆記】Transformer

Transformer 2017 年&#xff0c;谷歌團隊提出 Transformer 結構&#xff0c;Transformer 首先應用在自然語言處理領域中的機器翻譯任務上&#xff0c;Transformer 結構完全構建于注意力機制&#xff0c;完全丟棄遞歸和卷積的結構&#xff0c;這使得 Transformer 結構效率更高…

CI/CD(三) 安裝nfs并指定k8s默認storageClass

一、NFS 服務端安裝&#xff08;主節點 10.60.0.20&#xff09; 1. 安裝 NFS 服務端 sudo apt update sudo apt install -y nfs-kernel-server 2. 創建共享目錄并配置權限 sudo mkdir -p /data/k8s sudo chown nobody:nogroup /data/k8s # 允許匿名訪問 sudo chmod 777 /dat…

【QA】單件模式在Qt中有哪些應用?

單例設計模式確保一個類僅有一個實例&#xff0c;并提供一個全局訪問點來獲取該實例。在 Qt 框架中&#xff0c;有不少類的設計采用了單例模式&#xff0c;以下為你詳細介紹并給出相應代碼示例。 1. QApplication QApplication 是 Qt GUI 應用程序的核心類&#xff0c;每個 Q…

存儲過程觸發器習題整理1

46、{blank}設有商品表(商品號&#xff0c;商品名&#xff0c;單價)和銷售表(銷售單據號&#xff0c;商品號&#xff0c;銷售時間&#xff0c;銷售數量&#xff0c;銷售單價)。其中&#xff0c;商品號代表一類商品&#xff0c;商品號、單價、銷售數量和銷售單價均為整型。請編寫…

基于ChatGPT、GIS與Python機器學習的地質災害風險評估、易發性分析、信息化建庫及災后重建高級實踐

第一章、ChatGPT、DeepSeek大語言模型提示詞與地質災害基礎及平臺介紹【基礎實踐篇】 1、什么是大模型&#xff1f; 大模型&#xff08;Large Language Model, LLM&#xff09;是一種基于深度學習技術的大規模自然語言處理模型。 代表性大模型&#xff1a;GPT-4、BERT、T5、Ch…

單表達式倒計時工具:datetime的極度優雅(智普清言)

一個簡單表達式&#xff0c;也可以優雅自成工具。 筆記模板由python腳本于2025-03-22 20:25:49創建&#xff0c;本篇筆記適合任意喜歡學習的coder翻閱。 【學習的細節是歡悅的歷程】 博客的核心價值&#xff1a;在于輸出思考與經驗&#xff0c;而不僅僅是知識的簡單復述。 Pyth…

最優編碼樹的雙子性

現在看一些書&#xff0c;不太愿意在書上面做一些標記&#xff0c;也沒啥特殊的原因。。哈哈。 樹的定義 無環連通圖&#xff0c;極小連通圖&#xff0c;極大無環圖。 度 某個節點&#xff0c;描述它的度&#xff0c;一般默認是出度&#xff0c;分叉的邊的條數。或者說孩子…

MiB和MB

本文來自騰訊元寶 MiB 和 ?MB 有區別&#xff0c;盡管它們都用于表示數據存儲的單位&#xff0c;但它們的計算方式不同&#xff0c;分別基于不同的進制系統。 1. ?MiB&#xff08;Mebibyte&#xff09;? ?MiB 是基于二進制的單位&#xff0c;使用1024作為基數。1 MiB 102…

Labview和C#調用KNX API 相關東西

敘述:完全沒有聽說過KNX這個協議...................我這次項目中也是簡單的用了一下沒有過多的去研究 C#調用示例工程鏈接(labview調用示例在 DEBUG文件夾里面) 通過網盤分享的文件&#xff1a;KNX調用示例.zip 鏈接: https://pan.baidu.com/s/1NQUEYM11HID0M4ksetrTyg?pwd…

損失函數理解(二)——交叉熵損失

損失函數的目的是為了定量描述不同模型&#xff08;例如神經網絡模型和人腦模型&#xff09;的差異。 交叉熵&#xff0c;顧名思義&#xff0c;與熵有關&#xff0c;先把模型換成熵這么一個數值&#xff0c;然后用這個數值比較不同模型之間的差異。 為什么要做這一步轉換&…

Kubernetes的Replica Set和ReplicaController有什么區別

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理應用程序副本的兩種資源&#xff0c;它們有類似的功能&#xff0c;但 ReplicaSet 是 ReplicationController 的增強版本。 以下是它們的主要區別&#xff1a; 1. 功能的演進 ReplicationController 是 Kubernete…

信息系統運行管理員教程3--信息系統設施運維

第3章 信息系統設施運維 信息系統設施是支撐信息系統業務活動的信息系統軟硬件資產及環境。 第1節 信息系統設施運維的管理體系 信息系統設施運維的范圍包含信息系統涉及的所有設備及環境&#xff0c;主要包括基礎環境、硬件設備、網絡設備、基礎軟件等。 信息系統設施運維…

如何通過Python實現自動化任務:從入門到實踐

在當今快節奏的數字化時代,自動化技術正逐漸成為提高工作效率的利器。無論是處理重復性任務,還是管理復雜的工作流程,自動化都能為我們節省大量時間和精力。本文將以Python為例,帶你從零開始學習如何實現自動化任務,并通過一個實際案例展示其強大功能。 一、為什么選擇Pyt…

Spring Boot 與 MyBatis Plus 整合 KWDB 實現 JDBC 數據訪問

? 引言 本文主要介紹如何在 IDEA 中搭建一個使用 Maven 管理的 Spring Boot 應用項目工程&#xff0c;并結合在本地搭建的 KWDB 數據庫&#xff08;版本為&#xff1a;2.0.3&#xff09;來演示 Spring Boot 與 MyBatis Plus 的集成&#xff0c;以及對 KWDB 數據庫的數據操作…