美文网首页Flutter
Flutter TextField实践 2022-06-09 周

Flutter TextField实践 2022-06-09 周

作者: 勇往直前888 | 来源:发表于2022-06-09 15:52 被阅读0次

    简介

    TextField更像是Android的或者是前端的,跟iOS的UITextField差距有点大;
    与TextFormField是不同的风格,是两种不同的组件。

    两种输入框

    InputDecoration

    有一个名字为decoration参数,这个基本上是必须的一个参数,虽然提供了默认值,大多数情况都是要改的。这个决定了TextField的外观。

    InputDecoration

    TextEditingController

    • text属性和iOS中的UITextField一样,代表了文本的内容。预设文本,获取用户输入,都是通过设置这个text属性来实现。

    • 清空用户输入,可以设置text属性来实现,不过更好的方式是通过调用clear()方法来做。

    • 监听用户的输入,可以通过TextField的onChange参数来做,但是更好的方法,是设置TextEditingController的addListener()方法。Android目前也流行设置监听器,iOS那种通过delegate的方式确实不大好。当然,方便地时候,直接在onChange参数中处理用户输入监听的事,也未尝不可

    • TextEditingController是一种资源,需要调用dispose()方法进行回收。

    @override
      void dispose() {
        // Clean up the controller when the widget is removed from the
        // widget tree.
        myController.dispose();
        super.dispose();
      }
    

    FocusNode

    这个主要是用来设置焦点,焦点游标的位置等等。
    如果不是必要,可以不用管这个。
    这是个自找麻烦的事。

    • FocusNode是一种资源,需要调用dispose()方法进行回收。
      @override
      void dispose() {
        // Clean up the focus node when the Form is disposed.
        myFocusNode.dispose();
    
        super.dispose();
      }
    

    清除按钮

    iOS的UITextFiled组件有个自动显示或者隐藏的清除按钮。这个啥也不用做就有功能再Flutter中实现很不容易。

    • 设置的位置在InputDecoration的suffixIcon参数,这是个可选的widget,所以可以添加手势之类的。

    • 在手势响应中,调用TextEditingController的clear()方法,实现清除功能。

    • 如果要求有内容显示,没内容,不显示,那么还需要进行用户输入监控。下面的例子就是这样的。当然setState(() {}); 放在onChange参数后面也是可以的。

    //_usernameController是输入框的控制对象
    _usernameController.addListener(() {
      setState(() {}); 
    });
    
    TextFormField(                  
      controller: _usernameController,
      decoration: InputDecoration(
        labelText: '用户名',
        //文本框的尾部图标
        suffixIcon: _usernameController.text.length > 0 ? IconButton(  //如果文本长度不为空则显示清除按钮
          onPressed: () {
            _usernameController.clear();
          },
          icon: Icon(Icons.cancel, color: Colors.grey)
        ) : null
      ),
    )
    
    • 如果还要求做到像iOS的UITextField那样,获得焦点正在编辑是才显示,那就更麻烦了。还需要引入FocusNode的监听

    参考文章

    flutter文本输入框TextFormField后如何显示清除按钮,点击后清除输入内容?

    Flutter文本输入框TextField控制器TextEditingController,TextField预设内容,获取TextField中的输入内容,兼听TextField中的内容变化

    响应文本框内容的更改

    焦点和文本框

    Text fields

    输入框及表单

    相关文章

      网友评论

        本文标题:Flutter TextField实践 2022-06-09 周

        本文链接:https://www.haomeiwen.com/subject/vejmmrtx.html