Flutter进阶:深入探究 TextField

image

TextField 介绍

TextField 组件可以让用户填写信息。 实现 TextField 的代码非常简单:

TextField()
image

从TextField中检索信息

由于 TextFields 组件没有像 Android 中那样的 ID,因此无法根据需要检索文本,而必须在更改时将其存储在变量中或使用控制器。

  1. 最简单的方法是使用 onChanged 方法并将当前值存储在一个变量中。示例代码如下:

    String value = "";
    TextField(
      onChanged: (text) {
        value = text;
      },
    )
    
  2. 第二种方法是使用 TextEditingController 。 控制器连接到 TextField ,让我们也可以监听和控制 TextField 的内容。

    TextEditingController controller = TextEditingController();
    TextField(
      controller: controller,
    )
    

    我们可以这样监听变化

    controller.addListener(() {
      // Do something here
    });
    

    获取、设置文本内容:

    print(controller.text); // Print current value
    controller.text = "Demo Text"; // Set new value
    

TextField 中其他的回调

TextField 组件还提供其他回调,例如:

  1. onEditingCompleted
  2. onSubmitted
onEditingComplete: () {},
onSubmitted: (value) {},

这些是在用户单击 iOS 上的“完成”按钮时调用的回调。

在 TextField 中使用焦点

在 TextField 上“聚焦”意味着激活 TextField ,键盘的任何输入都将导致在聚焦的 TextField 中输入数据。

1. 使其自动聚焦

要在创建窗口时在 TextField 上自动对焦,请将自动对焦字段设置为 true 。

TextField(
  autofocus: true,
),

默认情况下,这会将焦点设置在 TextField 上。

image

2.自定义更改焦点

如果我们想要改变焦点而不仅仅是自动对焦怎么办? 看下面代码 ,我们将 FocusNode 附加到 TextField 并使用它来切换焦点。

// Initialise outside the build method
FocusNode nodeOne = FocusNode();
FocusNode nodeTwo = FocusNode();
// Do this inside the build method
TextField(
  focusNode: nodeOne,
),
TextField(
  focusNode: nodeTwo,
),
RaisedButton(
  onPressed: () {
    FocusScope.of(context).requestFocus(nodeTwo);
  },
  child: Text("Next Field"),
),

我们创建两个焦点节点并将它们附加到 TextFields 。 按下按钮时,我们使用 FocusScope 请求焦点到下一个TextField。

image

更改 TextFields 的键盘属性

Flutter 中的 TextField 允许我们自定义与键盘相关的属性。

1.键盘类型

TextField 允许您自定义在 TextField 成为焦点时显示的键盘类型。 我们更改 keyboardType 属性。

TextField(
  keyboardType: TextInputType.number,
),  

类型有:

  1. TextInputType.text (普通全键盘)
  2. TextInputType.number (数字键盘)
  3. TextInputType.emailAddress (普通键盘,带有“@”符号)
  4. TextInputType.datetime (数字键盘,带有 “/” 和 “:” 符号)
  5. TextInputType.multiline (数字键盘,带有启用有符号和十进制模式的选项)

2.TextInputAction

更改 TextField 的 textInputAction 可以更改键盘本身的操作按钮。

例如:

TextField(
  textInputAction: TextInputAction.continueAction,
),

这会导致 “Done” 按钮被 “Continue” 按钮替换:

image

或者:

TextField(
  textInputAction: TextInputAction.send,
),
image

还有很多类型,这里不一一列举。

3.自动更正

启用或禁用特定 TextField 的自动更正。 使用自动更正字段进行如下设置。

TextField(
  autocorrect: false,
),

这将禁用更正。

4.文本大写

TextField 提供了一些有关如何使用户输入中的字母大写的选项。

TextField(
  textCapitalization: TextCapitalization.sentences,
),

选项有::

  1. TextCapitalization.sentences

    这可以使每个句子的首字母大写。

    image
  2. TextCapitalization.characters

    大写句子中的所有字符。

    image
  3. TextCapitalization.words

    大写每个单词的首字母。

    image

Text Style, Alignment 和 Cursor

Flutter 允许自定义 TextField 内的文本样式和对齐方式以及 TextField 内的光标。

TextField 内的文本对齐方式

使用 textAlign 属性调整 TextField 中光标的位置。

TextField(
  textAlign: TextAlign.center,
),
image

通常的对齐属性有:start, end, left, right, center, justify.

在 TextField 中设置文本样式

我们使用 style 属性来更改 TextField 内部文本的样式。 使用它来更改颜色,字体大小等。这类似于文本组件中的样式属性,这里我们不多做介绍。

TextField(
  style: TextStyle(color: Colors.red, fontWeight: FontWeight.w300),
),
image

更改 TextField 中的光标

可以直接自定义 TextField 组件的光标。

您可以更改光标颜色,宽度和半径。 例如,在这里我自定义了一个圆形红色光标。

TextField(
  cursorColor: Colors.red,
  cursorRadius: Radius.circular(16.0),
  cursorWidth: 16.0,
),
image

控制 TextField 中的大小和最大长度

TextFields 可以控制其中写入的最大字符数、最大行数并在键入文本时展开。

控制最大字符数

TextField(
  maxLength: 4,
),
image

通过设置 maxLength 属性,将强制执行最大长度,并且默认情况下会将计数器添加到 TextField 。

制作可扩展的TextField

有时,我们需要 TextField 当一行完成时会扩展。 在Flutter中,做法有点奇怪(但很容易)。 我们将 maxLines 设置为 null ,默认为1。

image

注意:默认情况下,将 maxLines 设置为直接值会将其自动扩展为该行数。

TextField(
  maxLines: 3,
)
image

模糊文字

要隐藏 TextField 中的文本,请将 obscureText 设置为true 。

TextField(
  obscureText: true,
),
image

装饰 TextField

至此,我们专注于 Flutter 提供的输入功能。 现在我们来实际设计一个漂亮的 TextField 。

为了装饰 TextField,我们使用了带有 InputDecoration 的 decoration 属性。 由于 InputDecoration 类非常庞大,我们快速过一遍它的重要属性。

使用提示和标签属性向用户提供信息

提示和标签都是字符串,可帮助用户理解要在 TextField 中输入的信息。 不同之处在于,当标签浮动在 TextField上时,一旦用户开始输入,提示就会消失。

Hint
Label

您可以使用 “icon”,“prefixIcon” 和 “suffixIcon” 添加图标

您可以直接向 TextFields 添加图标。 您也可以使用 prefixText 和 suffixText 代替 Text。

TextField(
  decoration: InputDecoration(
    icon: Icon(Icons.print)
  ),
),
image
TextField(
  decoration: InputDecoration(
    prefixIcon: Icon(Icons.print)
  ),
),
image

对于其他任何组件,使用 “prefix” 而不是 “prefixIcon”

要使用通用组件而不是仅仅一个图标,请使用 prefix field 。让我们在 TextField 中添加一个圆形进度框。

TextField(
  decoration: InputDecoration(
    prefix: CircularProgressIndicator(),
  ),
),
image

hintlabel 等每个属性都有各自的样式字段

TextField(
  decoration: InputDecoration(
    hintText: "Demo Text",
    hintStyle: TextStyle(fontWeight: FontWeight.w300, color: Colors.red)
  ),
),

注意:虽然我在此示例中这样操作,但通常不会更改提示颜色。

如果您不想要标签而想要为用户提供持久消息,请使用 “helperText” 。

TextField(
  decoration: InputDecoration(
    helperText: "Hello"
  ),
),
image

使用 “decoration:null” 或 InputDecoration.collapsed 删除 TextField 上的默认下划线

使用这些删除 TextField 上的默认下划线。

TextField(
  decoration: InputDecoration.collapsed(hintText: "")
),

image

使用 “border” 为 TextField 设置边框

TextField(
  decoration: InputDecoration(
    border: OutlineInputBorder()
  )
),

image

您可以进一步做大量的装饰,我不可能将所有你需要的样式做出来。 但我希望这我已经让你知道怎么将它做出来!

最后

利用时间整理分析自己所学的知识是件非常有意义的事情,希望这也能帮到其他正在学习的同学。同时我也正在用Flutter写几个项目,写好之后就会开源给大家。

Github:https://github.com/MeandNi

微信:yangjk128

原文博客:https://meandni.com/2019/01/26/1be6/

欢迎一起交流移动开发的技术!

参考链接

原英文博客

官方文档

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

推荐阅读更多精彩内容