flutter实现验证码自动填充

2023-11-06

UI效果图

实现思路

1、使用Stack层叠布局

2、创建 4 个 Container 作为显示 4个验证码的 视图

3、创建TextField覆盖在 Container 上面 设置字体位透明颜色

 4、监听TextField 输入  填充 4 个 Container 刷新UI

具体代码如下

import 'package:flutter/material.dart';
import 'package:z_chat_flutter/tools/CustomStyle.dart';
import 'package:z_chat_flutter/tools/ImageConfig.dart';

import '../tools/ColorConfig.dart';

class CodeAutoFillWidget extends StatefulWidget {
  const CodeAutoFillWidget({Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() => _CodeAutoFillWidget();
}

class _CodeAutoFillWidget extends State<CodeAutoFillWidget> {

  TextEditingController? control;
  //定义4个长度的验证码
  int maxWord = 4;

  @override
  void initState() {
    super.initState();
    control = TextEditingController();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    var codeText = "${control?.value.text}";
    return Container(
      height: 50,
      width: 304,
      child: Stack(
        children: [
          Row(
            children: [
              Container(
                alignment: AlignmentDirectional.center,
                width: 50,
                height: 50,
                margin: EdgeInsets.only(left: 15),
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(5),
                    border: Border.all(color: Color0FE9EA)),
                child: Text(
                  codeText.length > 0 ? codeText.substring(0, 1) : "",
                  style: CText(
                    s: 24.0,
                  ),
                ),
              ),
              Container(
                alignment: AlignmentDirectional.center,
                width: 50,
                height: 50,
                margin: EdgeInsets.only(left: 25),
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(5),
                    border: Border.all(color: Color0FE9EA)),
                child: Text(
                  codeText.length > 1 ? codeText.substring(1, 2) : "",
                  style: CText(
                    s: 24.0,
                  ),
                ),
              ),
              Container(
                alignment: AlignmentDirectional.center,
                width: 50,
                height: 50,
                margin: EdgeInsets.only(left: 25),
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(5),
                    border: Border.all(color: Color0FE9EA)),
                child: Text(
                  codeText.length > 2 ? codeText.substring(2, 3) : "",
                  style: CText(
                    s: 24.0,
                  ),
                ),
              ),
              Container(
                alignment: AlignmentDirectional.center,
                width: 50,
                height: 50,
                margin: EdgeInsets.only(left: 25),
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(5),
                    border: Border.all(color: Color0FE9EA)),
                child: Text(
                  codeText.length > 3 ? codeText.substring(3, 4) : "",
                  style: CText(
                    s: 24.0,
                  ),
                ),
              ),
            ],
          ),
          Padding(
            padding: EdgeInsets.only(left: 0),
            child: TextField(
              controller: control,
              textAlign: TextAlign.start,
              maxLength: 4,
              onChanged: (value) {
                setState(() {});
              },
              showCursor: false,
              style: TextStyle(
                color: Colors.transparent,
                fontWeight: FontWeight.bold,
                fontSize: 24,
                letterSpacing: 36,
              ),
              decoration: InputDecoration(
                  hintText: "",
                  border: InputBorder.none,
                  contentPadding: EdgeInsets.only(left: 30)),
              // )
            ),
          )
        ],
      ),
    );
  }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter实现验证码自动填充 的相关文章

  • layout.xml 的用途是什么?

    人们为什么使用layout xml在他们的resources like
  • 如何将十六进制数组转换为 UIImage?

    有几个与使用 P25mi 动态打印图像相关的未解答问题 没有一个得到公认的答案 下面有几个链接 如何将图像转换为位图代码以便在 iPhone 中进行蓝牙打印 https stackoverflow com questions 1383828
  • Firebase Cloud Function:& Flutter:无法在模拟器上使用 https 可调用函数 [firebase_functions/unavailable] 不可用

    我试图从我的 flutter 应用程序中使用模拟器调用 HTTPS 可调用函数 但它似乎不起作用 我调用该函数后 总是需要大约 5 秒的时间并返回错误 如果我将该功能部署在服务器上 它就可以完全正常工作 这是我的功能 exports try
  • 如何在照片删除后刷新 Android 的 MediaStore

    问题 如何使媒体存储刷新其已删除文件的条目 从外部存储中删除代码中的照片后 我仍然在图库中看到已删除照片的插槽 空白照片 画廊似乎反映了媒体存储 并且在媒体存储中找到了已删除的照片 直到手机重新启动或通常 直到重新扫描媒体为止 尝试扫描已删
  • 下载图像并显示它

    应用程序的主要目的是下载和显示图像 但是当我尝试启动应用程序时它崩溃了 这是我的代码 private DownloadImageTask task protected void onCreate Bundle savedInstanceSt
  • Cordova 地理定位不适用于 Android

    我想在 Android 上使用地理定位 我用 Apache Cordova 编写应用程序 地理定位在 android 电脑模拟器和 android 手机上均不起作用 I try http cordova apache org docs en
  • Python Kivy - 在本机网络浏览器中打开 url 的应用程序

    我尝试制作一个简单的应用程序 在单击 Screen One 上的按钮后 在 Kivy 中打开一个网页 我使用了这个主题 Python 在应用程序中直接显示网络浏览器 iframe https stackoverflow com questi
  • 当参数具有默认值时,为什么无法使用导航组件将参数传递给片段?

    我正在使用导航组件 但我不明白为什么如果定义了参数 则将参数传递给下面的方法时会出现错误 我正在使用 SafeArgs 只有当我为此参数定义默认值时才会出现此错误 有人可以解释一下为什么会发生这种情况以及如何解决它吗 这是导航图的部分代码
  • 如何在 Xcode 4 中通过一个操作归档多个目标

    我有一个包含多个目标的项目 这些目标都适用于不同的 iOS 应用程序 例如 一个用于精简版的目标 另一个用于专业版的目标 我想立即构建并归档我的所有应用程序 目前 我对每个目标都有一个方案 我用它来独立归档每个应用程序 但现在我必须开始归档
  • 当 TextFormField 聚焦时如何隐藏错误外观

    我在用着TextFormField用于表单和自定义验证器方法返回错误消息 我试图隐藏默认错误消息和错误边框TextFormField当文本字段获得焦点时 TextFormField focusNode focusNode validator
  • 如何在android中录制音频时暂停背景音乐

    我正在 Android 中开发一个音频记录应用程序 因此 如果设备音乐播放器中已播放任何背景音乐 则应在开始录制之前暂停该背景音乐 并且每当录制停止或暂停时 背景音乐都应恢复 播放录制的音频时也应该如此 有人可以帮我解决这个问题吗 提前致谢
  • 具有多种自定义单元格类型的 RxSwift 表视图

    我想知道是否有任何代码示例RxSwift当我可以在一个表视图中使用多个自定义单元格时 例如 我有两个部分 第一部分有 10 个单元格 类型为CellWithImage标识符和第二部分有 10 个带有类型的单元格CellWithVideo标识
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4
  • 播放(非库)Apple Music 内容 - 请求失败

    我正在尝试使用以下代码播放专辑 let predicate MPMediaPropertyPredicate value 1459938538 forProperty MPMediaItemPropertyAlbumPersistentID
  • Android:如何通过右侧的十字按钮清除EditText

    我创建了一个EditText用于搜索 左侧包含搜索图标 右侧包含图标
  • Jetpack Compose 部分或开放侧边框

    我正在尝试绘制部分或一侧开放的矩形圆形边框以实现此效果 玩了一下之后我得到了这个 这是通过以下方式完成的 RoundedCornerShape topStartPercent 50 bottomStartPercent 50 start R
  • ormlite 将日期读取为 'yyyy-MM-dd'

    我需要读取给我的 sqlite 数据库 因此我无法更改表中的日期格式 yyyy MM dd 当我尝试使用 ormlite 为我生成对象时 使用以下注释 DatabaseField columnName REVISION DATE dataT
  • OpenGL ES 2.0 屏幕闪烁

    我面临着一个大问题 我正在使用带有 Android 4 0 3 的 Transformer tf101 选项卡 我的应用程序使用自定义 OpenGL ES 2 0 表面 我正在用纹理渲染多个平面 该纹理大约发生变化 每秒 20 次 并通过传
  • 在 Android 中更新到 API 26 时,清单合并失败并出现多个错误

    我尝试使用 API 26 更新我的 gradle 安卓工作室2 3 3 但我在编译项目时遇到以下错误 这是我收到的错误的屏幕截图 应用级别build gradle Top level build file where you can add

随机推荐

  • RHCE第五次作业

    1 总结变量的类型及含义 2 实现课堂案例计算长方形面积 6种方式 3 定义变量url https blog csdn net weixin 45029822 article details 103568815 通过多种方法实现 1 截取网
  • 2-2-7 React 几个用Hooks的小技巧

    1 Hooks 控制流 if useEffect gt Hooks是对行为的声明 if else 是分支控制 不是声明的一部分 从理论上不应该有声明在控制流之下 在React内部通过Hooks的词法顺序来区分不同的Hook 2 Stacko
  • 在PyCharm上安装TENSORFLOW

    上周联系了一下南科大的老师 老师比较和蔼可亲 安排我先学习一下MNIST数据集进行深度学习方向图像识别的入门 本来上周应该要完成的但还是因为搭建平台 学校实训等各方面原因 没能及时完成 特别是在想用pycharm用来安装tensorflow
  • 台式计算机怎么连接蓝牙 win10,win10台式电脑蓝牙怎么开启(开启电脑蓝牙的步骤图)...

    原标题 win10台式电脑蓝牙怎么开启 开启电脑蓝牙的步骤图 虽然WiFi无线连接现在是主流 但蓝牙无线连接仍然以独特的优势得以在许多设备中保留 例如Win10动态锁自动锁定功能就是利用电脑与手机的蓝牙连接实现的 下面MS酋长就来分享一下W
  • 找回微信聊天记录-unbaksdpak解包软件图文教程

    前几天用小米助手备份恢复后微信聊天记录丢失 上网找资料搞鼓了一天终于找回了聊天记录 在上个分享帖子里有详细介绍了找回过程 但有机友某些步骤看不懂 要我再出个图文教程 我想主要应该是GitHub上的解包软件不会用吧 这次主要讲一下unbaks
  • 3分钟入门:Blob 对象的了解与创建

    Blob 对象 Blob 英文全称 binary large object 是指二进制类型大对象 Blob 对象表示不可变的 类似文件对象的原始数据 即它是类似文件对象的二进制数据 可以像操作 File 对象一样操作 Blob 对象 但话又
  • Python入门——第一章 python编程基础

    Python入门 文章目录 Python入门 第一章 python编程基础 1 1 基本输入输出 1 1 1使用print 函数进行简单输出 chr 函数 print 输出到指定文件 print 输出年份 月份 日期 1 1 2使用prin
  • 给定一个整数,判断它能否被3,5,7整除,并输出以下信息:

    1 能同时被3 5 7整除 直接输出3 5 7 每个数中间一个空格 2 只能被其中两个数整除 输出两个数 小的在前 大的在后 例如 3 5或者3 7或者5 7 中间用空格分隔 ififa 3 只能被其中一个数整除 输出这个除数 4 不能被任
  • ESP32学习笔记(七) 复位和时钟

    ESP32学习笔记 七 复位和时钟 目录 ESP32学习笔记 一 芯片型号介绍 ESP32学习笔记 二 开发环境搭建 VSCode platformio ESP32学习笔记 三 硬件资源介绍 ESP32学习笔记 四 串口通信 ESP32学习
  • FFMPEG常用的一些命令介绍:音频录制、视频录制

    1 视频和音频单独抓取 如果指定输入格式和设备 则ffmpeg可以直接捕获视频和音频 Linux下捕获摄像头的数据保存成视频文件 ffmpeg f video4linux2 s 1280x720 i dev video0 test mp4
  • [从零开始学习FPGA编程-31]:进阶篇 - 基本时序电路-RS触发器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 基本RS触发器 1 1 概述 1 2 R
  • Linux安装go环境

    Linux安装go环境 安装go需要以下步骤 安装go需要以下步骤 下载安装包 到官网 https golang org dl 下载安装包 选择对应的操作系统和架构 比如Linux的64位系统可以选择 gox x x linux amd64
  • C语言_字符串拼接函数strcat使用及实现

    字符串拼接函数strcat 01 字符串拼接函数strcat函数原型 char strcat char dest const char src 作用 把src所指向的字符串 包括 0 复制到dest所指向的字符串后面 删除 dest原来末尾
  • LeetCode·每日一题·1080. 根到叶路径上的不足节点·递归

    作者 小迅 链接 https leetcode cn problems insufficient nodes in root to leaf paths solutions 2279048 di gui zhu shi chao ji xi
  • Eclipse中引用依赖库library失败的原因

    http blog csdn net dennisruan article details 50730641
  • C语言常见问题——数组初始化的四种方法

    有一回 小易同学对我说 你学过编程吗 我略略点一点头 他说 学过编程 我便考一考你 在使用数组之前 应不应该初始化数组 我暗想 这么简单的问题 也配考我么 不只是数组 在使用任何变量之前 都应该对变量进行初始化 这是一个编程的好习惯 可以有
  • element plus安装引入使用大坑

    最近做毕设 准备用vue写前端 自然用到了elementplus 处处踩雷必须记录 首先是版本对应 vue2对应element ui vue3对应element plus 强行安装只会出错 另外安装的时候需要把已经npm run的项目停下来
  • Linux内核分析与应用

    Linux 内核分析与应用 1 蜻蜓点水 可作抛砖引玉 1 概述 用到的几个命令 insmod dmesg 2 lsmod 3 章节测试 部分可参考 4 lt 1 gt Linux得以流行 是因为遵循了GPL协议 并不是因为遵循POSIX标
  • ElasticSearch6.x 之索引

    1 创建索引 创建索引语法规则 http elasticsearch 服务器访问地址 索引名称 Put请求 无参数 实列 http 192 168 1 74 9200 security 在elasticsearch 服务器上创建名为secu
  • flutter实现验证码自动填充

    UI效果图 实现思路 1 使用Stack层叠布局 2 创建 4 个 Container 作为显示 4个验证码的 视图 3 创建TextField覆盖在 Container 上面 设置字体位透明颜色 4 监听TextField 输入 填充 4