IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter实现验证码输入框 -> 正文阅读

[移动开发]Flutter实现验证码输入框

Flutter实现验证码输入框

思路:使用Stack布局,下层设计出每个框的样式,上层使用一个透明的输入框。

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:get/get.dart';

class CodePage extends StatefulWidget {
  final String tel;
  CodePage(this.tel);
  @override
  _CodePageState createState() => _CodePageState();
}

class _CodePageState extends State<CodePage> {
  //重新发送验证码计时器
  Timer _codeTimer;
  //重新发送验证码倒计时
  int _codeTime = 60;
  //是否重新发送验证码
  bool _reSendCode = false;
  //textfield焦点
  FocusNode _codeFocus = new FocusNode();
  //当前输入验证码的位置
  int _currentCount = 0;
  //闪烁光标计时器
  Timer _timer;
  //验证码
  String _code = "";
  //闪烁光标颜色
  Color _cursorColor = Colors.transparent;
  //textfield控制器
  TextEditingController _codeController = new TextEditingController();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    //进入页面自动获取焦点,弹出键盘
    _codeFocus.requestFocus();
    //闪烁光标
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      _cursorColor = Colors.transparent;
      if (mounted) {
        setState(() {});
      }
      Future.delayed(Duration(milliseconds: 500), () {
        _cursorColor = Colors.blue;
        if (mounted) {
          setState(() {});
        }
      });
    });
  }

  @override
  void dispose() {
    // TODO: implement dispose
    //判断计时器是否活跃,活跃取消
    if (_timer.isActive) {
      _timer.cancel();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        leading: IconButton(
          icon: Icon(
            Icons.arrow_back_ios,
            size: ScreenUtil().setSp(16),
          ),
          onPressed: () {
            Get.back();
          },
        ),
      ),
      body: SingleChildScrollView(
        child: Container(
          color: Colors.white,
          width: ScreenUtil().screenWidth,
          height: ScreenUtil().screenHeight,
          padding: EdgeInsets.only(
            left: ScreenUtil().setWidth(20),
            right: ScreenUtil().setWidth(20),
            top: ScreenUtil().setHeight(20),
          ),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Container(
                height: ScreenUtil().setHeight(34),
                margin: EdgeInsets.only(bottom: ScreenUtil().setHeight(8)),
                child: Text(
                  "请输入6位验证码",
                  style: TextStyle(
                    fontSize: ScreenUtil().setSp(28),
                  ),
                ),
              ),
              Container(
                height: ScreenUtil().setHeight(22),
                margin: EdgeInsets.only(bottom: ScreenUtil().setHeight(56)),
                child: Text(
                  "验证码已发送至+86 ${widget.tel}",
                  style: TextStyle(
                    fontSize: ScreenUtil().setSp(16),
                    color: Color.fromRGBO(127, 127, 127, 1),
                  ),
                ),
              ),
              Container(
                height: ScreenUtil().setHeight(20),
                margin: EdgeInsets.only(bottom: ScreenUtil().setHeight(10)),
                child: Text(
                  "6位验证码",
                  style: TextStyle(
                    fontSize: ScreenUtil().setSp(14),
                  ),
                ),
              ),
              Container(
                width: ScreenUtil().setWidth(368),
                height: ScreenUtil().setHeight(48),
                margin: EdgeInsets.only(bottom: ScreenUtil().setHeight(59)),
                child: Stack(
                  children: [
                    Row(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: [
                        buildCodeCell(0),
                        SizedBox(
                          width: ScreenUtil().setWidth(8),
                        ),
                        buildCodeCell(1),
                        SizedBox(
                          width: ScreenUtil().setWidth(8),
                        ),
                        buildCodeCell(2),
                        SizedBox(
                          width: ScreenUtil().setWidth(8),
                        ),
                        buildCodeCell(3),
                        SizedBox(
                          width: ScreenUtil().setWidth(8),
                        ),
                        buildCodeCell(4),
                        SizedBox(
                          width: ScreenUtil().setWidth(8),
                        ),
                        buildCodeCell(5),
                      ],
                    ),
                    Opacity(
                      opacity: 0,
                      child: SizedBox(
                        width: ScreenUtil().screenWidth,
                        child: TextField(
                          onChanged: (value) {
                            setState(() {
                              _code = value;
                              _currentCount = value.length;
                            });
                            if (value.length == 6) {
                              checkCode();
                            }
                          },
                          focusNode: _codeFocus,
                          maxLength: 6,
                          controller: _codeController,
                          keyboardType: TextInputType.number,
                          decoration: InputDecoration(
                            counterText: "",
                          ),
                          textAlign: TextAlign.center,
                          style: TextStyle(fontSize: ScreenUtil().setSp(20)),
                        ),
                      ),
                    )
                  ],
                ),
              ),
              Container(
                width: ScreenUtil().setWidth(335),
                height: ScreenUtil().setHeight(42),
                child: ElevatedButton(
                  style: ButtonStyle(
                    backgroundColor: MaterialStateProperty.all(
                      Color.fromRGBO(0, 138, 133, 1),
                    ),
                  ),
                  onPressed: () {},
                  child: Text(
                    "登录",
                    style: TextStyle(
                        fontSize: ScreenUtil().setSp(14), color: Colors.white),
                  ),
                ),
              ),
              Container(
                child: Row(
                  mainAxisSize: MainAxisSize.max,
                  mainAxisAlignment: MainAxisAlignment.end,
                  children: [
                    !_reSendCode
                        ? TextButton(
                            child: Text("没收到验证码?"),
                            onPressed: () {
                              showCupertinoDialog(
                                  context: context,
                                  builder: (BuildContext context) {
                                    return CupertinoAlertDialog(
                                      title: Text("提示"),
                                      content: Text("是否重新发送验证码"),
                                      actions: [
                                        CupertinoDialogAction(
                                          child: Text("确认"),
                                          onPressed: () {
                                            Fluttertoast.showToast(
                                                msg: "验证码已重新发送,请注意短信提示");
                                            Get.back();
                                            //退出选择框后设置重新发送验证码
                                            _reSendCode = true;
                                            //设置验证码时间60
                                            _codeTime = 60;
                                            //设置计时器,每秒减1
                                            _codeTimer = Timer.periodic(
                                                Duration(seconds: 1), (timer) {
                                                  //如果验证码时间为0
                                              if (_codeTime == 0) {
                                                _reSendCode = false;
                                                setState(() {});
                                                return;
                                              } else {
                                                //不为0没秒减1
                                                _codeTime--;
                                                setState(() {});
                                              }
                                            });
                                          },
                                        ),
                                        CupertinoDialogAction(
                                          child: Text("取消"),
                                          onPressed: () {
                                            Get.back();
                                          },
                                        ),
                                      ],
                                    );
                                  });
                            },
                          )
                        : Container(
                        margin: EdgeInsets.only(top: ScreenUtil().setHeight(8)),
                        child: Text("重新发送验证码($_codeTime)")),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  GestureDetector buildCodeCell(int pos) {
    return GestureDetector(
      onTap: () {
        _codeFocus.requestFocus();
      },
      child: Container(
        width: ScreenUtil().setWidth(48),
        height: ScreenUtil().setHeight(48),
        decoration: BoxDecoration(
          border: Border(
            bottom: _currentCount != pos
                ? BorderSide(color: Colors.black, width: 1)
                : BorderSide(width: 0, color: Colors.transparent),
          ),
        ),
        child: _currentCount == pos
            ? Center(
                child: Text(
                  "|",
                  style: TextStyle(fontSize: 25, color: _cursorColor),
                ),
              )
            : _code.length > pos
                ? Center(
                    child: Text(
                    "${_code[pos]}",
                    style: TextStyle(fontSize: 25),
                  ))
                : null,
      ),
    );
  }

  void checkCode() {
    print(_code);
  }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:51:16  更:2021-07-30 12:53:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 1:20:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码