刚开始做Flutter文本框时候,应用的是TextField。仿佛大多数状况下都没有问题。代码模式如下:

class _FooState extends State<Foo> {  TextEditingController _controller;  @override  void initState() {    super.initState();    _controller = new TextEditingController(text: '初始化内容');  }  @override  Widget build(BuildContext context) {    return new Column(      children: <Widget>[        new TextField(          // 当TextField 第一次创立时,controller会蕴含初始值,          // 当用户批改文本框内容时,会批改controller的值。          controller: _controller,        ),        new RaisedButton(          onPressed: () {            // 通过clear()能够清空controller的值。            _controller.clear();          },          child: new Text('清空'),        ),      ],    );  }}

问题1:动态创建文本框初始值

个别状况下,间接应用这种形式,没有任何问题。然而当初有一种状况:

问题1: 当页面文本框中的初始值是动静的,从后盾获取到的时候,应该怎么办呢?

这种状况下,阐明创立TextEditingController时,并不知道文本内容。这个时候如果动静批改controller的话,会报错,基本没法应用。

这种状况我基本没遇到过,然而我感觉Flutter必定有解决办法。所以我去找了一下Flutter的文档,总算是没有白找,找到了一个(https://api.flutter.dev/flutt...[组件] TextFormField

文档中有一句:

If a controller is not specified, initialValue can be used to give the automatically generated controller an initial value.

意思就是说,当不指定controller时,initialValue 就能够主动生成controller的初始值。

既然有解决方案,那么就是批改一下代码即可。

class _FooState extends State<Foo> {  @override  void initState() {    super.initState();  }  @override  Widget build(BuildContext context) {    return new Column(      children: <Widget>[        new TextFormField(          initialValue: "初始值"        ),      ],    );  }}

通过TextFormField这个组件,轻松解决掉这个问题了。

问题2: TextField和TextFormField的区别?

问题尽管解决了,然而当初又有另外一个问题了:

问题2: TextField和TextFormField的区别是什么?什么时候应用TextField?什么时候应用TextFormField?

TextFormField:

例如制作一个表单,表单中有用户姓名,姓名必须蕴含@符号。这个时候就须要应用TextFormField这个组件

TextFormField(  autovalidateMode: AutovalidateMode.always, // 开启主动验证  decoration: const InputDecoration(    icon: Icon(Icons.person),    hintText: 'What do people call you?',    labelText: 'Name *',  ),  onSaved: (String value) {    // 当用户保留表单时,返回内容。  },  validator: (String value) {    // 表单验证    return value.contains('@') ? 'Do not use the @ char.' : null;  },)

TextField:

例如制作一个显示文本框,框中提醒输出文本框中的内容信息。

TextField(  obscureText: true,  decoration: InputDecoration(    border: OutlineInputBorder(),    labelText: 'Password',  ),)

总结:

  • 如果须要应用保留、重置、验证用户输出的状况下,应用TextFormField
  • 如果只须要简略的捕捉用户的输出行为,只须要应用TextField组件即可。
  • TextFormField须要个Form组件。