Flutter Form表單控制項超全總結
- 2020 年 3 月 14 日
- 筆記
注意:無特殊說明,Flutter版本及Dart版本如下:
- Flutter版本: 1.12.13+hotfix.5
- Dart版本: 2.7.0
Form、FormField、TextFormField是表單相關控制項,類似於H5中form。
FormField
FormField是一個表單控制項,此控制項包含表單的狀態,方便更新UI,通常情況下,我們不會直接使用FormField,而是使用TextFormField。
TextFormField
TextFormField繼承自FormField,是一個輸入框表單,因此TextFormField中有很多關於TextField的屬性,TextFormField的基本用法:
TextFormField( onSaved: (value){ print('$value'); }, autovalidate: false, validator: (String value){ return value.length>=6?null:'帳號最少6個字元'; }, )
TextFormField效果如下:
onSaved
是一個可選參數,當Form調用FormState.save時才會回調此方法。
autovalidate
參數為是否自動驗證,設置為true時,TextField發生變化就會調用validator,設置false時,FormFieldState.validate調用時才會回調validator,如果Form的autovalidate
設置為true,TextFormField忽略此參數。
validator
驗證函數,輸入的值不匹配的時候返回的字元串顯示在TextField的errorText屬性位置,返回null,表示沒有錯誤。
Form
Form組件是一個容器類控制項,可以包含多個FormField表單控制項,這樣的好處是統一管理。
在使用Form的時候需要設置其key,通過key獲取當前的FormState,然後可以調用FormState的save
、validate
、reset
等方法,一般通過如下方法設置:
final _formKey = GlobalKey<FormState>(); Form( key: _formKey, ... )
獲取FormState並調用相關方法:
var _state = _formKey.currentState; if(_state.validate()){ _state.save(); }
validate
方法為驗證表單數據的合法性,此方法會調用每一個FormField的validator
回調,此回調需要字元串表示數據驗證不通過,將會在改表單下顯示返回的字元串,具體可查看下TextFormField介紹。
save
方法回調每一個FormField的save方法,通常情況下保存表單數據。
用Form寫一個簡單的登錄功能,程式碼如下:
var _account = ''; var _pwd = ''; final _formKey = GlobalKey<FormState>(); Form( key: _formKey, child: Column( children: <Widget>[ TextFormField( decoration: InputDecoration(hintText: '輸入帳號'), onSaved: (value) { _name = value; }, validator: (String value) { return value.length >= 6 ? null : '帳號最少6個字元'; }, ), TextFormField( decoration: InputDecoration(hintText: '輸入密碼'), obscureText: true, onSaved: (value) { _pwd = value; }, validator: (String value) { return value.length >= 6 ? null : '帳號最少6個字元'; }, ), RaisedButton( child: Text('登錄'), onPressed: () { var _state = Form.of(context); if(_state.validate()){ _state.save(); login(_name,_pwd); } }, ) ], ), )
我們希望用戶在輸入表單時點擊返回按鈕提示用戶"確認退出嗎?",用法如下:
Form( key: _formKey, onWillPop: () async { return await showDialog<bool>( context: context, builder: (BuildContext context) { return AlertDialog( title: Text('提示'), content: Text('確認退出嗎?'), actions: <Widget>[ FlatButton( child: Text('取消'), onPressed: () { Navigator.of(context).pop(false); }, ), FlatButton( child: Text('確認'), onPressed: () { Navigator.of(context).pop(true); }, ), ], ); }); }, ... )
效果如下:
onWillPop
回調決定Form
所在的路由是否可以直接返回,該回調需要返回Future<bool>
,返回false
表示當前路由不會返回;為true
,則會返回到上一個路由。此屬性通常用於攔截返回按鈕。
onChanged
:當子表單控制項發生變化時回調。
歡迎加入Flutter的微信交流群(mqd_zzy),一起學習,一起進步,生活不止眼前的苟且,還有詩和《遠方》。
當然我也非常希望您關注我個人的公眾號,裡面有各種福利等著大家哦。