目录
- 重点是什么?
- 从头开始制作 otp 字段
- 使用第三个包
- 结论
本文向您展示了在 flutter 中实现完美的验证码输入框几种不同方法。
重点是什么?
真实世界的 完美的验证码输入框或 pin 输入 ui 通常满足以下最低要求:
- 有4个或6个文本域,每个文本域只能接受1个字符(通常是一个数字)
- 输入数字后自动聚焦下一个字段
您经常在需要电话号码确认、电子邮件或双因素身份验证的应用程序中看到此功能。
从头开始制作 otp 字段
应用预览
此示例创建一个简单的 otp 屏幕。首先,聚焦第一个输入字段。当您输入一个数字时,光标将自动移动到下一个字段。当按下提交按钮时,您输入的 otp 代码将显示在屏幕上。
以下是它的工作原理:
测试此应用程序时,您应该使用模拟器的软键盘而不是计算机的硬件键盘。
代码
创建一个名为otpinput的可重用小部件:
// create an input widget that takes only one digit
class 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<homescreen> createstate() => _homescreenstate();
}
class _homescreenstate extends state<homescreen> {
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 digit
class 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<homescreen> createstate() => _homescreenstate();
}
class _homescreenstate extends state<homescreen> {
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,
),
),
),
);
}
}
结论
我们已经介绍了 2 个在 flutter 中创建现代优雅的 完美的验证码输入框/pin 输入字段的示例。
到此这篇关于flutter验证码输入框的2种方法实现的文章就介绍到这了,更多相关flutter验证码输入框内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!