Flutter TextField 详细介绍

Flutter Textfield可以实现的效果

image.png

基本属性

TextField

 const TextField({
    Key key,
    this.controller,//控制器
    this.focusNode,//焦点
    this.obscureText = false,//是否隐藏文本,即显示密码类型
    this.maxLines = 1,//最多行数,高度与行数同步
    this.autofocus = false,//自动聚焦
    this.decoration = const InputDecoration(),//装饰
    TextInputType keyboardType,//键盘类型,即输入类型
    this.onChanged,//输入改变回调

    //以下属性不常用,用到再来查看
    this.textInputAction,//键盘按钮
    this.textCapitalization = TextCapitalization.none,//大小写
    this.style,//样式
    this.strutStyle,
    this.textAlign = TextAlign.start,//对齐方式
    this.textDirection,
    this.autocorrect = true,//自动更正
    this.minLines,//最小行数
    this.expands = false,
    this.maxLength,//最多输入数,有值后右下角就会有一个计数器
    this.maxLengthEnforced = true,
    this.onEditingComplete,//输入完成时,配合TextInputAction.done使用
    this.onSubmitted,//提交时,配合TextInputAction
    this.inputFormatters,//输入校验
    this.enabled,//是否可用
    this.cursorWidth = 2.0,//光标宽度
    this.cursorRadius,//光标圆角
    this.cursorColor,//光标颜色
    this.keyboardAppearance,
    this.scrollPadding = const EdgeInsets.all(20.0),
    this.dragStartBehavior = DragStartBehavior.start,
    this.enableInteractiveSelection,
    this.onTap,//点击事件
    this.buildCounter,
    this.scrollPhysics,
  }) 

属性有很多但是很多都不常用,不用死记,记几个常用即可

decoration(装饰器) 接收一个InputDecoration类型的值,主要用于控制TextField的外观以及提示信息等 这里介绍下这个重要的Widget,

InputDecoration

InputDecoration({
    this.icon,    //位于装饰器外部和输入框前面的图片
    this.labelText,  //用于描述输入框,例如这个输入框是用来输入用户名还是密码的,当输入框获取焦点时默认会浮动到上方,
    this.labelStyle,  // 控制labelText的样式,接收一个TextStyle类型的值
    this.helperText, //辅助文本,位于输入框下方,如果errorText不为空的话,则helperText不会显示
    this.helperStyle, //helperText的样式
    this.hintText,  //提示文本,位于输入框内部
    this.hintStyle, //hintText的样式
    this.hintMaxLines, //提示信息最大行数
    this.errorText,  //错误信息提示
    this.errorStyle, //errorText的样式
    this.errorMaxLines,   //errorText最大行数
    this.hasFloatingPlaceholder = true,  //labelText是否浮动,默认为true,修改为false则labelText在输入框获取焦点时不会浮动且不显示
    this.isDense,   //改变输入框是否为密集型,默认为false,修改为true时,图标及间距会变小
    this.contentPadding, //内间距
    this.prefixIcon,  //位于输入框内部起始位置的图标。
    this.prefix,   //预先填充的Widget,跟prefixText同时只能出现一个
    this.prefixText,  //预填充的文本,例如手机号前面预先加上区号等
    this.prefixStyle,  //prefixText的样式
    this.suffixIcon, //位于输入框后面的图片,例如一般输入框后面会有个眼睛,控制输入内容是否明文
    this.suffix,  //位于输入框尾部的控件,同样的不能和suffixText同时使用
    this.suffixText,//位于尾部的填充文字
    this.suffixStyle,  //suffixText的样式
    this.counter,//位于输入框右下方的小控件,不能和counterText同时使用
    this.counterText,//位于右下方显示的文本,常用于显示输入的字符数量
    this.counterStyle, //counterText的样式
    this.filled,  //如果为true,则输入使用fillColor指定的颜色填充
    this.fillColor,  //相当于输入框的背景颜色
    this.errorBorder,   //errorText不为空,输入框没有焦点时要显示的边框
    this.focusedBorder,  //输入框有焦点时的边框,如果errorText不为空的话,该属性无效
    this.focusedErrorBorder,  //errorText不为空时,输入框有焦点时的边框
    this.disabledBorder,  //输入框禁用时显示的边框,如果errorText不为空的话,该属性无效
    this.enabledBorder,  //输入框可用时显示的边框,如果errorText不为空的话,该属性无效
    this.border, //正常情况下的border
    this.enabled = true,  //输入框是否可用
    this.semanticCounterText,  
    this.alignLabelWithHint,
  })

属性也是很多下面举几个常用的例子

样式

基础样式

TextField(),

很简单,无任何参数,当然效果也很简单。(默认是带下划线的)

image.png

隐藏文本(变成密码框)

修改obscureText属性值

              TextField(
                obscureText: true,
              ),
image.png

键盘类型

键盘类型 即 可输入的类型,比如number就只能输入数字

             TextField(
                keyboardType: TextInputType.number, // TextInputType还有很多别键盘可以根据自己需要的场景调用
              ),
image.png

最多行数

设置最多3行 (设置的行数会影响TextField高度)

           TextField(
                maxLines: 3,
              ),
image.png

InputDecoration 装饰器

这个InputDecoration可以控制textField的很多样式 如 图标,前后图标,前后文字,提示文本,帮助文本,错误文本 边框等等

  • placeholder 提示文字

            TextField(
                decoration: InputDecoration(
                  hintText: '请输入账号aaa',
                ),
              ),
image.png
  • 去除下划线(早就看他不舒服了)


  TextField(
                decoration: InputDecoration
                {
                     hintText: '请输入删除车辆的原因',
                      
                     border:InputBorder.none
              }
              ),
image.png
  • 边框

   TextField(
                decoration: InputDecoration(
                  border: OutlineInputBorder(),
                ),
              ),
image.png

无论是下面的装饰线,还是矩形边框装饰线,失焦后都是 灰色 ,对焦都是主题颜色的 这里你可能会问我怎么改变他边框的颜色呢OutlineInputBorder里的borderSide是无法改变的,这是flutter 的一个坑

  • 解决方案 包裹一层Theme Widget

  Theme(
      data: new ThemeData(primaryColor: Colors.red, hintColor: Colors.blue),
      child: TextField(
        decoration: InputDecoration(
            contentPadding: EdgeInsets.all(10.0),
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(15.0),
//            borderSide: BorderSide(color: Colors.red, width: 3.0, style: BorderStyle.solid)//没什么卵效果
            )),
      ),
    );

这里还有个坑 ThemeData(primaryColor: Colors.red, hintColor: Colors.blue), 这个hintColor 默认颜色好像还是不起作用,这个问题不在怎么设置,知道的可以回复一下,3q

  • 圆角

     TextField(
                decoration: InputDecoration(
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.all(Radius.circular(30)),
                  ),
                ),
              ),
image.png

图标

图标有3种

  • 左侧外的图标

      TextField(
                decoration: InputDecoration(
                  icon: Icon(Icons.person),
                ),
              ),
image.png
  • 左侧内图标

      TextField(
                decoration: InputDecoration(
                  prefixIcon: Icon(Icons.phone_android),
                ),
              ),

image.png
  • 右侧内图标

         TextField(
                decoration: InputDecoration(
                  suffixIcon: IconButton(
                    icon: Icon(Icons.close),
                    onPressed: () {
                      controller.clear();
                    },
                  ),
                ),
              ),
image.png

还有一些什么帮助文字,错误文字,悬浮文字,前后填充文字 这里就不一一介绍了,用到的情况较少

获取输入内容

有两种方式:

  • onChanged
    onChanged是输入内容改变时的回调,返回一个String类型的数值,可以用一个变量记一下
           TextField(
                onChanged: (text) {
                  print("输入改变时" + text);
                },
              ),
  • controller
    controller控制器,初始化:
 var controller = TextEditingController();
 controller.addListener(() {});
//配置给TextField
   TextField(
                controller: controller,
        ),
//获取输入的值
controller.text
//清除Textfield输入的值
controller.clear();

焦点问题

往往我们在事件中提交的时候,是需要关闭软键盘的

这里我们就用到了focusNode

初始化:

   FocusNode userFocusNode = FocusNode();
   TextField(
                focusNode: userFocusNode,
              ),


//然后在需要的地方调用:失去焦点
userFocusNode.unfocus();


点击APP别的地方(不是其他textField的时候需要收起键盘) FocusScope.of(context).requestFocus(); //获取焦点的意思,你获取了焦点,别人就失去了焦点

溢出问题

  • 软键盘弹出之后遮盖

  • 软键盘弹出之后高度溢出

解决方案:

用滑动组件包裹起来(SingleChildScrollView,ListView等),这样软键盘弹出的时候,输入框也会自动向上滑。

以上如有说的不正确的地方,犹豫刚接触不久,还望指出.


image.png

文章转自:
@yechaoa
https://blog.csdn.net/yechaoa/article/details/90906689

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350