Flutter Form表單控件超全總結

Flutter Form表單控件超全總結

注意:無特殊說明,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效果如下:

Flutter Form表單控件超全總結

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的savevalidatereset等方法,一般通過如下方法設置:

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);
          }
        },
      )
    ],
  ),
)

Flutter Form表單控件超全總結

我們希望用戶在輸入表單時點擊返回按鈕提示用戶"確認退出嗎?",用法如下:

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);
                },
              ),
            ],
          );
        });
  },
  ...
)

效果如下:

Flutter Form表單控件超全總結

onWillPop回調決定Form所在的路由是否可以直接返回,該回調需要返回Future&lt;bool&gt;,返回false表示當前路由不會返回;爲true,則會返回到上一個路由。此屬性通常用於攔截返回按鈕。

onChanged:當子表單控件發生變化時回調。

歡迎加入Flutter的微信交流羣(<font color='red'>mqd_zzy</font>),讓我們一起學習,一起進步,開始我們的故事,生活不止眼前的苟且,還有詩和《遠方》。

當然我也非常希望您關注我個人的公衆號,裏面有各種福利等着大家哦。

Flutter Form表單控件超全總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章