千家信息网

Flutter验证码输入框的实现方法有哪些

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,Flutter验证码输入框的实现方法有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。重点是什么?真实世界的 完美的验
千家信息网最后更新 2025年02月05日Flutter验证码输入框的实现方法有哪些

Flutter验证码输入框的实现方法有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

重点是什么?

真实世界的 完美的验证码输入框或 PIN 输入 UI 通常满足以下最低要求:

  • 有4个或6个文本域,每个文本域只能接受1个字符(通常是一个数字)

  • 输入数字后自动聚焦下一个字段

您经常在需要电话号码确认、电子邮件或双因素身份验证的应用程序中看到此功能。

从头开始制作 OTP 字段

应用预览

此示例创建一个简单的 OTP 屏幕。首先,聚焦第一个输入字段。当您输入一个数字时,光标将自动移动到下一个字段。当按下提交按钮时,您输入的 OTP 代码将显示在屏幕上。

以下是它的工作原理:

测试此应用程序时,您应该使用模拟器的软键盘而不是计算机的硬件键盘。

代码

创建一个名为OtpInput的可重用小部件:

// Create an input widget that takes only one digitclass OtpInput extends StatelessWidget {  final TextEditingController controller;  final bool autoFocus;  const OtpInput(this.controller, this.autoFocus, {Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    return SizedBox(      height: 60,      width: 50,      child: TextField(        autofocus: autoFocus,        textAlign: TextAlign.center,        keyboardType: TextInputType.number,        controller: controller,        maxLength: 1,        cursorColor: Theme.of(context).primaryColor,        decoration: const InputDecoration(            border: OutlineInputBorder(),            counterText: '',            hintStyle: TextStyle(color: Colors.black, fontSize: 20.0)),        onChanged: (value) {          if (value.length == 1) {            FocusScope.of(context).nextFocus();          }        },      ),    );  }}

main.dart 中的完整源代码和解释(我将OtpInput类放在文件底部):

import 'dart:math' as math;import 'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:async/async.dart';import 'package:flutter/scheduler.dart';import 'package:url_strategy/url_strategy.dart';void main() {  setPathUrlStrategy();  runApp(MyApp());}class MyApp extends StatelessWidget {  const MyApp({Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    return MaterialApp(      // Hide the debug banner      debugShowCheckedModeBanner: false,      title: '坚果',      theme: ThemeData(        primarySwatch: Colors.indigo,      ),      home: const HomeScreen(),    );  }}class HomeScreen extends StatefulWidget {  const HomeScreen({Key? key}) : super(key: key);  @override  State createState() => _HomeScreenState();}class _HomeScreenState extends State {  String _imageUrl =      'https://luckly007.oss-cn-beijing.aliyuncs.com/image/image-20211124085239175.png';  double _fontSize = 20;  String _title = "坚果公众号";  // 4 text editing controllers that associate with the 4 input fields  final TextEditingController _fieldOne = TextEditingController();  final TextEditingController _fieldTwo = TextEditingController();  final TextEditingController _fieldThree = TextEditingController();  final TextEditingController _fieldFour = TextEditingController();  // This is the entered code  // It will be displayed in a Text widget  String? _otp;  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text(_title),      ),      body: Column(        mainAxisAlignment: MainAxisAlignment.center,        children: [          const Text('请输入验证码'),          const SizedBox(            height: 30,          ),          // Implement 4 input fields          Row(            mainAxisAlignment: MainAxisAlignment.spaceEvenly,            children: [              OtpInput(_fieldOne, true),              OtpInput(_fieldTwo, false),              OtpInput(_fieldThree, false),              OtpInput(_fieldFour, false)            ],          ),          const SizedBox(            height: 30,          ),          ElevatedButton(              onPressed: () {                setState(() {                  _otp = _fieldOne.text +                      _fieldTwo.text +                      _fieldThree.text +                      _fieldFour.text;                });              },              child: const Text('提交')),          const SizedBox(            height: 30,          ),          // Display the entered OTP code          Text(            _otp ?? '验证码',            style: const TextStyle(fontSize: 30),          )        ],      ),    );  }}// Create an input widget that takes only one digitclass OtpInput extends StatelessWidget {  final TextEditingController controller;  final bool autoFocus;  const OtpInput(this.controller, this.autoFocus, {Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    return SizedBox(      height: 60,      width: 50,      child: TextField(        autofocus: autoFocus,        textAlign: TextAlign.center,        keyboardType: TextInputType.number,        controller: controller,        maxLength: 1,        cursorColor: Theme.of(context).primaryColor,        decoration: const InputDecoration(            border: OutlineInputBorder(),            counterText: '',            hintStyle: TextStyle(color: Colors.black, fontSize: 20.0)),        onChanged: (value) {          if (value.length == 1) {            FocusScope.of(context).nextFocus();          }        },      ),    );  }}

使用第三个包

为了仅用几行代码快速实现您的目标,您可以使用第三方插件。在我们的例子中一些好的是pin_code_fields,otp_text_field等。 下面的例子将使用pin_code_fileds,它提供了很多很棒的功能:

  • 自动将下一个字段集中在打字上,将上一个字段集中在委派上

  • 可以设置为任意长度

  • 高度可定制

  • 输入文本的 3 种不同类型的动画

  • 动画活动、非活动、选定和禁用字段颜色切换

  • 自动对焦选项

  • 从剪贴板粘贴 OTP 代码

您还可以在终端窗口中看到您输入的字符:

代码

1.安装插件:

flutter pub add pin_code_fields

2.最终代码:

import 'dart:math' as math;import 'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:async/async.dart';import 'package:pin_code_fields/pin_code_fields.dart';import 'package:url_strategy/url_strategy.dart';void main() {  setPathUrlStrategy();  runApp(MyApp());}class MyApp extends StatelessWidget {  const MyApp({Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    return MaterialApp(      // Hide the debug banner      debugShowCheckedModeBanner: false,      title: '坚果',      theme: ThemeData(        primarySwatch: Colors.indigo,      ),      home: const HomeScreen(),    );  }}class HomeScreen extends StatefulWidget {  const HomeScreen({Key? key}) : super(key: key);  @override  State createState() => _HomeScreenState();}class _HomeScreenState extends State {  String _imageUrl =      'https://luckly007.oss-cn-beijing.aliyuncs.com/image/image-20211124085239175.png';  double _fontSize = 20;  String _title = "坚果公众号";  // 4 text editing controllers that associate with the 4 input fields  TextEditingController textEditingController = TextEditingController();  String currentText = "";  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text(_title),      ),      body: Padding(        padding: const EdgeInsets.all(30),        child: Center(          child: PinCodeTextField(            length: 6,            obscureText: false,            animationType: AnimationType.fade,            pinTheme: PinTheme(              shape: PinCodeFieldShape.box,              borderRadius: BorderRadius.circular(5),              fieldHeight: 50,              fieldWidth: 40,              activeFillColor: Colors.white,            ),            animationDuration: const Duration(milliseconds: 300),            backgroundColor: Colors.blue.shade50,            enableActiveFill: true,            controller: textEditingController,            onCompleted: (v) {              debugPrint("Completed");            },            onChanged: (value) {              debugPrint(value);              setState(() {                currentText = value;              });            },            beforeTextPaste: (text) {              return true;            },            appContext: context,          ),        ),      ),    );  }}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

输入 字段 代码 验证 坚果 数字 应用 例子 公众 功能 动画 字符 屏幕 应用程序 插件 程序 键盘 本域 帮助 活动 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全中文博客 计算机网络技术五级的就业方向 生产制造管理软件开发价格 像素工厂服务器ip地址列表 台州数据库培训课程 吃么互联网科技服务有限公司 我的世界纯公益服务器生存 数据库统计表里的种类 数据库中的复数查询语句 软件开发用c语言 亿企软件开发电话号码 安卓有什么编程软件开发 办公室网络服务器管理员 数据库统计总金额 网上购物系统项目软件开发 中国网络安全综合立法是什么 有没有关于组织标本的免费数据库 软件开发4K显示器 网络技术和网络空间安全 维普数据库检索输出包括 数据库技术函数count it网络安全方面的有什么证书呢 软件开发选题 网络安全大生态软件 服务器机房销售价格 加工中心数据库用什么软件 吴通控股网络安全 计算机网络安全未来趋势论文 云计算对网络安全的需求 所有的网络安全元素里最安全
0