关于flask:Flutter-文本框初始化是显示默认值

刚开始做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组件。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理