前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Flutter 专题】64 图解基本 TextField 文本输入框 (一)

【Flutter 专题】64 图解基本 TextField 文本输入框 (一)

作者头像
阿策小和尚
发布于 2019-10-22 08:35:20
发布于 2019-10-22 08:35:20
4.8K00
代码可运行
举报
文章被收录于专栏:阿策小和尚阿策小和尚
运行总次数:0
代码可运行

和尚最近在学习基础的 Flutter Widget,原因在于很多基础的组件有很多容易忽视的注意事项,了解并熟悉后对整体的开发认知会有所提升;今天和尚学习一下 TextField 文本输入框;

源码分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const TextField({
    Key key,
    this.controller,                    // 控制正在编辑文本
    this.focusNode,                     // 获取键盘焦点
    this.decoration = const InputDecoration(),              // 边框装饰
    TextInputType keyboardType,         // 键盘类型
    this.textInputAction,               // 键盘的操作按钮类型
    this.textCapitalization = TextCapitalization.none,      // 配置大小写键盘
    this.style,                         // 输入文本样式
    this.textAlign = TextAlign.start,   // 对齐方式
    this.textDirection,                 // 文本方向
    this.autofocus = false,             // 是否自动对焦
    this.obscureText = false,           // 是否隐藏内容,例如密码格式
    this.autocorrect = true,            // 是否自动校正
    this.maxLines = 1,                  // 最大行数
    this.maxLength,                     // 允许输入的最大长度
    this.maxLengthEnforced = true,      // 是否允许超过输入最大长度
    this.onChanged,                     // 文本内容变更时回调
    this.onEditingComplete,             // 提交内容时回调
    this.onSubmitted,                   // 用户提示完成时回调
    this.inputFormatters,               // 验证及格式
    this.enabled,                       // 是否不可点击
    this.cursorWidth = 2.0,             // 光标宽度
    this.cursorRadius,                  // 光标圆角弧度
    this.cursorColor,                   // 光标颜色
    this.keyboardAppearance,            // 键盘亮度
    this.scrollPadding = const EdgeInsets.all(20.0),        // 滚动到视图中时,填充边距
    this.enableInteractiveSelection,    // 长按是否展示【剪切/复制/粘贴菜单LengthLimitingTextInputFormatter】
    this.onTap,                         // 点击时回调
})

分析源码可得,TextField 是有状态 StatefulWidget,有丰富的属性,自定义化较高,实践中需要合理利用各种回调;

案例尝试

  1. 和尚尝试最基本的 TextField,区分默认状态和获取焦点状态;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField();
  1. 和尚尝试了光标的相关属性;cursorColor 为光标颜色,cursorWidth 为光标宽度,cursorRadius 为光标圆角;其中 Radius 提供了 circle 圆角和 elliptical 非圆角两种;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(cursorColor: Colors.purple.withOpacity(0.4), cursorWidth: 10.0, cursorRadius: Radius.circular(4.0));
  1. textAlign 为文字起始位置,可根据业务光标居左/居右/居中等;注意只是文字开始方向;textDirection 问文字内容方向,从左向右或从右向左;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(style: TextStyle(color: Colors.purple.withOpacity(0.7), fontSize: 18.0), textAlign: TextAlign.right);
  1. maxLength 为字符长度,设置时默认是展示一行,且右下角有编辑长度与整体长度对比;与 maxLengthEnforced 配合,maxLengthEnforcedtrue 时达到最大字符长度后不可编辑;为 false 时可继续编辑展示有差别;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(maxLength: 30, maxLengthEnforced: true);
return TextField(maxLength: 30, maxLengthEnforced: false);
  1. 设置 maxLength 之后右下角默认有字符计数器,设置 TextField.noMaxLength 即可只展示输入字符数;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(maxLength: TextField.noMaxLength);
  1. maxLines 为允许展现的最大行数,在使用 maxLength 时内容超过一行不会自动换行,因为默认 maxLines=1,此时设置为 null 或固定展示行数即可自动换行;区别在于 null 会展示多行,而 maxLines 最多只展示到设置行数;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(maxLength: 130, maxLengthEnforced: false, maxLines: null);
return TextField(maxLength: 130, maxLengthEnforced: false, maxLines: 2);
  1. obscureText 是否隐藏编辑内容,常见的密码格式;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(obscureText: true);
  1. enableInteractiveSelection 长按是否出现【剪切/复制/粘贴】菜单;不可为空;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(enableInteractiveSelection: false);
  1. keyboardAppearance 为键盘亮度,包括 Brightness.dark/light 两种,但仅限于 iOS 设备;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(keyboardAppearance: Brightness.dark);
  1. textCapitalization 文字大小写;理论上 sentences 为每句话第一个字母大写;characters 为每个字母大写;words 为每个单词首字母大写;但该属性仅限于 text keybord,和尚在本地更换多种方式并未实现,有待研究;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(textCapitalization: TextCapitalization.sentences);
  1. keyboardType 为键盘类型,和尚理解整体分为数字键盘和字母键盘等;根据设置的键盘类型,键盘会有差别;

a. 数字键盘 --1-- datetime 键盘上可随时访问 : 和 /; --2-- phone 键盘上可随时访问 # 和 *; --3-- number 键盘上可随时访问 + - * /

b. 字母键盘 --1-- emailAddress 键盘上可随时访问 @ 和 .; --2-- url 键盘上可随时访问 / 和 .; --3-- multiline 适用于多行文本换行; --4-- text 默认字母键盘;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(keyboardType: TextInputType.number);
return TextField(keyboardType: TextInputType.emailAddress);
  1. textInputAction 通常为键盘右下角操作类型,和尚以前稍微整理过,类型众多,建议多多尝试;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(textInputAction: TextInputAction.search);
  1. autofocus 是否自动获取焦点,进入页面优先获取焦点,并弹出键盘,若页面中有多个 TextField 设置 autofocustrue 则优先获取第一个焦点;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(autofocus: true);
  1. focusNode 手动获取焦点,可配合键盘输入等减少用户操作次数,直接获取下一个 TextField 焦点;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FocusScope.of(context).requestFocus(node);

return TextField(focusNode: node);
  1. enabled 设为 false 之后 TextField 为不可编辑状态;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(enabled: false);
  1. decoration 为边框修饰,可以借此来调整 TextField 展示效果;可以设置前置图标,后置图片,边框属性,内容属性等,和尚会在后续集中尝试;若要完全删除装饰,将 decoration 设置为空即可;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(decoration: InputDecoration(icon: Icon(Icons.android)));
  1. inputFormatters 为格式验证,例如原生 Android 中通常会限制输入手机号或其他特殊字符,在 Flutter 中也可以借此来进行格式限制,包括正则表达式;使用时需要引入 package:flutter/services.dart

a. LengthLimitingTextInputFormatter 限制最长字符;

b. WhitelistingTextInputFormatter 仅允许输入白名单中字符;如 digitsOnly 仅支持数字 [0-9]

c. BlacklistingTextInputFormatter 防止输入黑名单中字符;如 singleLineFormatter 强制输入单行;分析源码 RegExp("[/\]") 可以设置正则表达式;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(inputFormatters: <TextInputFormatter>[
  LengthLimitingTextInputFormatter(12),
  WhitelistingTextInputFormatter.digitsOnly,
  BlacklistingTextInputFormatter.singleLineFormatter
]);
  1. onChanged 文本内容变更时回调,可实时监听 TextField 输入内容;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Center(child: Text(_textStr))

return TextField(onChanged: (text) {
  setState(() {
    _textStr = text;
  });
});
  1. controller 文本控制器,监听输入内容回调;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TextEditingController controller = TextEditingController();

@override
void initState() {
  super.initState();
  controller.addListener(() {
    setState(() {
      _textStr = controller.text;
    });
  });
}

return TextField(controller: controller);
  1. onTap 点击 TextField时回调;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(
  onTap: () {
    Toast.show('onTap!', context, duration: Toast.LENGTH_SHORT, gravity: Toast.TOP);
  },
);
  1. onEditingComplete 在提交内容时回调,通常是点击回车按键时回调;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(
  onEditingComplete: () {
    Toast.show('onEditingComplete!', context, duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  },
);
  1. onSubmit 在提交时回调,不可与 onEditingComplete 同时使用,区别在于 onSubmit 是带返回值的回调;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(
  onEditingComplete: () {
    Toast.show('onSubmitted -> $text!', context, duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  },
);

问题小结

1. 键盘弹出会把输入框或其它组件顶上去?

TextField 获取焦点弹出输入框时,输入框可能会将页面中元素顶上去,为避免此情况,可将 ScaffoldresizeToAvoidBottomPadding: false 即可,resizeToAvoidBottomPadding 设置是否自动调整body属性控件的大小,以避免 Scaffold 底部被覆盖;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resizeToAvoidBottomPadding: false
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resizeToAvoidBottomPadding: true
2. 长按输入框出现【剪切/复制/粘贴】的菜单如何设置中文?

TextField 设置 enableInteractiveSelection 属性后长按会出现菜单,默认为英文,可通过设置 Flutter 国际化来处理;

  1. pubspec.yaml 中集成 flutter_localizations
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  1. MaterialApp 中设置本地化代理和支持的语言类型;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return MaterialApp(
  localizationsDelegates: [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  supportedLocales: [
    const Locale('zh', 'CN'),
    const Locale('en', 'US'),
  ]
}
3. 使用 maxLength 时如何取消文本框右下角字符计数器?
  1. maxLength 设置为 null 仅使用 LengthLimitingTextInputFormatter 限制最长字符;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(maxLength: null, inputFormatters: <TextInputFormatter>[
  LengthLimitingTextInputFormatter(10)
]);
  1. 设置 InputDecoration 中 **decoration** 属性为空;但是底部有空余,只是隐藏而并非消失;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return TextField(decoration: InputDecoration(counterText: ""), maxLength: 10);

文本框是日常开发中必不可少的组件,和尚还在探索过程中,如有问题请多多指导!

来源: 阿策小和尚

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿策小和尚 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java dategramsocket_Java使用DatagramSocket
Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。
全栈程序员站长
2022/06/27
3110
Socket通信
OSI是一个理想的模型,一般的网络系统只涉及其中的几层,在七层模型中,每一层都提供一个特殊 的网络功能,从网络功能角度观察:
小小工匠
2021/08/16
8880
UDP网络编程
进行数据传输时,首先将传输的数据定义成数据报(Datagram),在数据报中指明数据将要到达的Socket(主机地址和端口号),然后再将数据发送出去。
拾点阳光
2018/09/28
6780
Java Review(三十八、网络编程)
计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。
三分恶
2020/07/16
9270
Socket编程
IP(Internet Protocol),网络之间互连的协议,IP地址是区分不同计算机的唯一标识
用户9184480
2024/12/19
1080
Socket和DatagramSocket的区别[通俗易懂]
DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。
全栈程序员站长
2022/07/01
9060
【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器
接着上面,小编提到这里的DatagramPacket是一个输出型参数,和前面实现文件IO的操作类似的,这里的就是一个UDP数据报,是接收和发送数据的基本单位;
用户11288949
2024/10/21
1050
【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器
JavaTCP和UDP套接字编程
原文地址:http://www.cnblogs.com/MindMrWang/p/8919890.html 在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站(对安全性一起其他并发不作要求)的时候,其实我们会发现,Java后端是真的省事,好像除了CURD还是CURD,没有什么更新鲜的了。但是我们回顾计算机网络的知识提出疑问,计算机信息传输有TCP和UDP两种连
MindMrWang
2018/04/24
7120
JavaTCP和UDP套接字编程
【Netty】UDP协议使用学习
TCP协议已经尽可能的支持了并发 所以大部分还是使用的TCP协议 除非网络很差的情况下使用UDP
冷环渊
2022/05/01
1.4K0
Socket套接字(网络编程万字总结-附代码)
传输层、网络层、数据链路层、物理层 都是通过OS+硬件来提供服务的,而应用层要享受OS提供的网络服务,需要通过OS提供的服务窗口(Socket)来享受服务。
VIBE
2022/12/30
7770
Socket套接字(网络编程万字总结-附代码)
UDP 无连接上机案例3.4
用户9184480
2024/12/19
700
UDP 无连接上机案例3.4
【Java】21 基于 UDP 的网络编程
  UDP 协议是英文 User Datagram Protocol 的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络连接。UDP 协议从问世至今已经被使用了很多年,虽然 UDP 协议目前应用不如 TCP 协议广泛,但 UDP 协议依然是一个非常实用和可行的网络传输层协议。尤其是在一些实时性很强的应用场景中,比如网络游戏、视频会议等,UDP 协议的快速更具有独特的魅力。   UDP 协议是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。至于对方是否可以接收到这些数据内容,UDP 协议无法控制,因此说 UDP 协议是一种不可靠的协议。UDP 协议适用于一次只传送少量数据、对可靠性要求不高的应用环境。与 TCP 协议一样,UDP 协议直接位于 IP 协议之上。实际上,IP 协议属于 OSI 参考模型的网络层协议,而 UDP 协议和 TCP 协议都属于传输层协议。   因为 UDP 协议是面向非连接的协议,没有建立连接的过程,因此它的通信效率很高;但也正因为如此,它的可靠性不如 TCP 协议。UDP 协议的主要作用是完成网络数据流和数据报之间的转换。在信息的发送端,UDP 协议将网络数据流封装成数据报,然后将数据报发送出去;在信息的接收端,UDP 协议将数据报转换成实际数据内容。
Demo_Null
2020/09/28
6670
【Java】21 基于 UDP 的网络编程
在Java中实现UDP协议编程(DatagramSocket/DatagramPacket)「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。1.什么是UDP协议? UDP( User Datagram Protocol )协议是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。 UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。 2.为什么要使用UDP?
全栈程序员站长
2022/09/06
1.5K1
通过UDP广播实现Android局域网Peer Discovering
本文将介绍以下知识点: 1、TCP与UDP的区别; 2、单播、多播、广播; 3、Java中实现UDP的重要的类; 4、Peer Discovering方案 01 TCP vs UDP TCP:Transmission Control Protocol(传输控制协议) TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。TCP建立连接之后,通信双方都同时可以进行数据的传输,是全双工的。 在保证可靠性上
用户1332428
2018/03/08
2.6K0
通过UDP广播实现Android局域网Peer Discovering
Java中利用DatagramPacket与DatagramSocket进行通讯的示例
先运行Receiver工程,正在阻塞等待接收发送方发送的消息,总共接收到了5个消息,每个消息间隔5秒钟
全栈程序员站长
2022/08/22
3710
JAVA网络编程TCP通信
Socket称为“套接字”,描述IP地址和端口。在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应于不同的服务。Socket和ServerSocket类位于java.net包中。ServerSocket用于服务端,Socket是建立网络连接时使用的。连接成功时,应用程序两端都会产生一个Socket实例,通过操作这个实例完成所需会话。
HUC思梦
2020/09/03
8940
JAVA网络编程TCP通信
【网络】UDP和TCP之间的差别和回显服务器
操作系统给应用程序(传输层给应用层)提供的 API,起了个名字,就叫 Socket API
椰椰椰耶
2024/09/20
880
【网络】UDP和TCP之间的差别和回显服务器
Java中的UDP通信
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。与TCP协议不同,UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。在发送数据前,需要进行封包操作(使用 DatagramPacket 类),才能发送和接收数据(使用 DatagramSocket 类)。
头发还在
2023/10/16
2050
Java中的UDP通信
Java基础之UDP协议和TCP协议简介及简单案例的实现
写在前面的废话:马上要找工作了,做了一年的.net ,到要找工作了发现没几个大公司招聘.net工程师,真是坑爹呀。哎,java就java吧,咱从头开始学呗,啥也不说了,玩命撸吧,我真可怜啊。
CherishTheYouth
2019/07/30
8800
Java基础之UDP协议和TCP协议简介及简单案例的实现
【Java 网络编程】UDP API 简介 ( DatagramSocket | DatagramPacket )
DatagramSocket 类简介 : 负责 UDP 数据的发送和接收 , 该类没有合并到 Socket API 中 , 因为在 Socket 协议中 , 必须要存在服务器端与客户端 , 在 UDP 中 , DatagramSocket 既是服务器又是客户端 , 其不需要监听端口 , 也不需要建立连接 ;
韩曙亮
2023/03/27
4170
推荐阅读
相关推荐
java dategramsocket_Java使用DatagramSocket
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文