当前位置: 首页 > news >正文

Flutter 完美的验证码输入框 转载

刚开始看到这个功能的时候一定觉得so easy,开始的时候我也是这么觉得的,这还不简单,然而真正写的时候才发现并没有想象的那么简单。

先上图,不上图你们都不想看,我难啊,到Github: https://github.com/781238222/flutter-do 上给个小星星可还行,如果能fork一下,那更是感激不尽。

言归正传,完成验证码输入框经历了4个阶段,虽然前3个尝试是失败的,但也想和大家分享下,避免大家再走弯路。

第一阶段:开始的时候,我认为直接修改TextField控件,改改外观就可以了,所以我就直接去改TextField的属性,研究了一遍,发现无法达到要求,系统提供的属性无法达到我的要求。

第二阶段:既然原生的TextField无法实现我的效果,那就重写一个(并不是全部重写,而是把源代码copy出来,修改控制外观的代码),于是我就去copy源代码了,可真正copy的时候发现TextField的关系比较复杂,并不是一个简单的 StatefulWidget 控件,而且需要计算字符的宽度,此方案虽然能实现,但想想就复杂,果断抛弃。

第三阶段:用6个TextField,每一个控制一个验证码,虽然样式及布局上很容易达到要求,但焦点控制问题非常致命,此方案也pass。

第四阶段:经过上面失败的经历,最后我才用如下方案:一个TextField用于输入,而验证码的显示使用 Container ,验证码覆盖在TextField之上,用户无法感知到TextField,这是目前为止我发现的最完美的方案。

焦点问题
正常情况下,出现验证码的页面会弹出键盘,此效果很好实现,指需给TextField指定自动获取焦点即可,代码如下:

TextField(
autofocus:true,

)

如果页面还有其他输入框,那么就不一定要获取焦点了,因此是否获取焦点需要交给用户来决定。

如果开始没有获取焦点就出现了一个问题,用户点击“验证码”的时候需要获取焦点,获取焦点方法如下:

GestureDetector(
onTap: () {
FocusScope.of(context).requestFocus(_focusNode);
},

)

给整个控件的外层添加点击事件, _focusNode 为TextField的 focusNode 。

输入完成后,通常需要关闭键盘,即TextField失去焦点,失去焦点方法如下:

_focusNode.unfocus();
1.

使用
使用非常简单,如下:

Container(
height: 45,
child: VerificationBox(),
)
1.
2.
3.
4.

效果如下:

设置验证码的数量,比如设置4个:

VerificationBox(
count: 4,
)

效果如下:

设置样式,包括边框的颜色、宽度、圆角:

VerificationBox(
borderColor: Colors.lightBlue,
borderWidth: 3,
borderRadius: 50,
)

效果如下:

除了“盒子”样式,还支持下划线样式:

VerificationBox(
type: VerificationBoxItemType.underline,
)

效果如下:

设置数字的样式:

VerificationBox(
textStyle: TextStyle(color: Colors.lightBlue),
)

效果如下:

显示光标,设置光标样式:

VerificationBox(
showCursor: true,
cursorWidth: 2,
cursorColor: Colors.red,
cursorIndent: 10,
cursorEndIndent: 10,
)

效果如下:

还可以设置光标为整个边框,如下:

VerificationBox(
focusBorderColor: Colors.lightBlue,
)

效果如下:
在这里插入图片描述

终极大招,如果你觉得这个效果不好,你可以自定义 decoration :

VerificationBox(
decoration: BoxDecoration(
image: DecorationImage(image: AssetImage(‘images/box.png’)),
),
textStyle: TextStyle(color: Colors.lightBlue),
),
)

效果如下:

在这里插入图片描述

验证码输入完成后回调 onSubmitted ,用法如下:

VerificationBox(onSubmitted: (value){print('$value');},
)

输入完成后,默认键盘消失,设置为不消失,代码如下:

VerificationBox(unfocus: false,
)

Flutter 完美的验证码输入框
https://blog.51cto.com/u_15060545/4007871

http://www.lryc.cn/news/154533.html

相关文章:

  • SpringBoot整合Jpa实现增删改查功能(提供Gitee源码)
  • 微服务[Nacos]
  • 8K视频来了,8K 视频编辑的最低系统要求
  • AsyncContext优雅实现HTTP长轮询接口
  • 如何制作一个百货小程序
  • 【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法
  • MATLAB旋转动图的绘制
  • 算法笔记 近似最近邻查找(Approximate Nearest Neighbor Search,ANN)
  • uni-app 之 vue语法
  • Android之RecyclerView仿ViewPage滑动
  • 【owt-server】AudioSendAdapter分析
  • day33 List接口
  • 云原生周刊:Linkerd 发布 v2.14 | 2023.9.4
  • CS420 课程笔记 P5 - 内存编辑 数据类型
  • oracle报错 ORA-02290: 违反检查约束条件问题
  • Prometheus + grafana 的监控平台部署
  • npm、yarn、pnpm
  • 力扣|两数相加
  • prometheus通过blackbox-exporter监控web站点证书
  • CentOS7 Hadoop3.3.0 安装与配置
  • 2023年9月CDGA/CDGP数据治理认证考试报名,当然弘博创新
  • Re45:读论文 GPT-1 Improving Language Understanding by Generative Pre-Training
  • VB.NET 如何将某个Excel的工作表中复制到另一个的Excel中的工作表中https://bbs.csdn.net/topics/392861034
  • 深入解析Kotlin类与对象:构造、伴生、单例全面剖析
  • JavaScript构造函数
  • 手写嵌入式操作系统(基于stm8单片机)
  • vue3.3 ~
  • 滑动窗口实例4(将x减到0的最小操作数)
  • 数据库原理及应用(MySQL)
  • 初识Maven(一)命令行操作和idea创建maven工程