Flutter

Flutter输入框及表单

2019-11-04  本文已影响0人  IsYang

Material组件库中提供了输入框组件TextField和表单组件Form。下面我们分别介绍一下。


1. 组件 - TextField

TextField用于文本输入

属性包括:

  - labelText:  "用户名",
  - hintText: "用户名或邮箱",
  - prefixIcon: Icon(Icons.person)
  - // 未获得焦点下划线设为灰色
    enabledBorder: UnderlineInputBorder(
      borderSide: BorderSide(color: Colors.grey),
    ),
  -  //获得焦点下划线设为蓝色
    focusedBorder: UnderlineInputBorder(
      borderSide: BorderSide(color: Colors.blue),
    ),
  - text    文本输入键盘
  - multiline   多行文本,需和maxLines配合使用(设为null或大于1)
  - number  数字;会弹出数字键盘
  - phone   优化后的电话号码输入键盘;会弹出数字键盘并显示“* #”
  - datetime    优化后的日期输入键盘;Android上会显示“: -”
  - emailAddress    优化后的电子邮件地址;会显示“@ .”
  - url 优化后的url输入键盘; 会显示“/ .”

当获取一个文本框输入的值时,代码示例

// 定一个controller
TextEditingController _textController= TextEditingController();

TextField(
    autofocus: true,
    controller: _textController, //设置controller
    ...
)

// 获取输入框内容
_textController.text

2. 表单Form

Flutter提供了一个Form 组件,它可以对输入框进行分组,然后进行一些统一操作,如输入内容校验、输入框重置以及输入内容保存。

Form继承自StatefulWidget对象,它对应的状态类为FormState。我们先看看Form类的定义:

Form({
    Key key,
    @required this.child,
    this.autovalidate = false,
    this.onWillPop,
    this.onChanged,
  })

示例代码如下:

class FormTest extends StatefulWidget {
  @override
  _FormTestState createState() => new _FormTestState();
}

class _FormTestState extends State<FormTest> {
  TextEditingController _unameController = new TextEditingController();
  TextEditingController _pwdController = new TextEditingController();
  GlobalKey _formKey= new GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title:Text("Form Test"),
      ),
      body: Padding(
        padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0),
        child: Form(
          key: _formKey, //设置globalKey,用于后面获取FormState
          autovalidate: true, //开启自动校验
          child: Column(
            children: <Widget>[
              TextFormField(
                  autofocus: true,
                  controller: _unameController,
                  decoration: InputDecoration(
                      labelText: "用户名",
                      hintText: "用户名或邮箱",
                      icon: Icon(Icons.person)
                  ),
                  // 校验用户名
                  validator: (v) {
                    return v.trim().length > 0 ? null : "用户名不能为空";
                  }

              ),
              TextFormField(
                  controller: _pwdController,
                  decoration: InputDecoration(
                      labelText: "密码",
                      hintText: "您的登录密码",
                      icon: Icon(Icons.lock)
                  ),
                  obscureText: true,
                  //校验密码
                  validator: (v) {
                    return v.trim().length > 5 ? null : "密码不能少于6位";
                  }
              ),
              // 登录按钮
              Padding(
                padding: const EdgeInsets.only(top: 28.0),
                child: Row(
                  children: <Widget>[
                    Expanded(
                      child: RaisedButton(
                        padding: EdgeInsets.all(15.0),
                        child: Text("登录"),
                        color: Theme.of(context).primaryColor,
                        textColor: Colors.white,
                        onPressed: () {
                          // 通过_formKey.currentState 获取FormState后,
                          // 调用validate()方法校验用户名密码是否合法,校验
                          // 通过后再提交数据。 
                          if((_formKey.currentState as FormState).validate()){
                            //验证通过提交数据
                          }
                        },
                      ),
                    ),
                  ],
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}


还可以通过Form.of(context)来验证表单提交,如果直接在 onPressed 方法中获取,是不可行的,因为获取到的上下文context为 FormTest的context,而FormState是在FormTest的子树中, 所以需要通过Builder来构建按钮,Builder会将widget节点的context作为回调参数,代码示例如下:

Expanded(
  child:Builder(builder: (context){
    return RaisedButton(
      onPressed: () {
        if(Form.of(context).validate()){
          //验证通过提交数据
        }
      },
    );
  })
)
上一篇 下一篇

猜你喜欢

热点阅读