Flutter教程六格验证码功能开发
在Flutter中实现六格验证码功能时,如何优雅地处理每个输入格的焦点自动跳转?我尝试用TextEditingController监听,但输入完成后无法自动切换到下一格,且删除时光标会错乱。有没有完整的代码示例,既能实现输入验证、键盘类型限制(仅数字),又能保持UI整齐(如带下划线的方形输入框)?另外,如何解决软键盘弹出时输入区域被遮挡的问题?
3 回复
好的!以下是一个简单的六位验证码功能开发思路:
- 布局:使用
Row
布局,包含6个TextField
,每个设置最大长度为1。 - 焦点管理:每个输入框完成后自动跳转到下一个,最后一位时触发验证逻辑。
- 样式优化:统一输入框的宽度、边框和字体大小,增加用户体验。
代码示例:
import 'package:flutter/material.dart';
class SixDigitCode extends StatefulWidget {
@override
_SixDigitCodeState createState() => _SixDigitCodeState();
}
class _SixDigitCodeState extends State<SixDigitCode> {
late List<TextEditingController> controllers;
@override
void initState() {
super.initState();
controllers = List.generate(6, (_) => TextEditingController());
}
@override
void dispose() {
for (var controller in controllers) {
controller.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(6, (index) {
return SizedBox(
width: 40,
child: TextField(
maxLength: 1,
textAlign: TextAlign.center,
controller: controllers[index],
decoration: InputDecoration(
border: OutlineInputBorder(),
),
onChanged: (value) {
if (value.length == 1 && index < 5) {
controllers[index + 1].requestFocus();
}
},
),
);
}),
);
}
}
这样就实现了基本的六位验证码输入功能。记得在实际项目中添加逻辑处理用户输入的验证码。
更多关于Flutter教程六格验证码功能开发的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
Flutter 六格验证码功能开发
在Flutter中开发六格验证码功能,通常需要实现以下功能:
- 显示六个输入框(每格一个字符)
- 自动聚焦下一格
- 支持删除操作
实现方案
以下是实现六格验证码的完整代码:
import 'package:flutter/material.dart';
class SixDigitCodeInput extends StatefulWidget {
final Function(String)? onCompleted;
const SixDigitCodeInput({Key? key, this.onCompleted}) : super(key: key);
@override
_SixDigitCodeInputState createState() => _SixDigitCodeInputState();
}
class _SixDigitCodeInputState extends State<SixDigitCodeInput> {
List<TextEditingController> controllers = List.generate(6, (index) => TextEditingController());
List<FocusNode> focusNodes = List.generate(6, (index) => FocusNode());
List<String> codes = List.filled(6, '');
@override
void initState() {
super.initState();
for (int i = 0; i < 6; i++) {
controllers[i].addListener(() {
if (controllers[i].text.length == 1) {
codes[i] = controllers[i].text;
if (i < 5) {
focusNodes[i].unfocus();
focusNodes[i + 1].requestFocus();
} else {
focusNodes[i].unfocus();
widget.onCompleted?.call(codes.join());
}
} else if (controllers[i].text.isEmpty && i > 0) {
focusNodes[i].unfocus();
focusNodes[i - 1].requestFocus();
}
});
}
}
@override
void dispose() {
for (var controller in controllers) {
controller.dispose();
}
for (var focusNode in focusNodes) {
focusNode.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: List.generate(6, (index) {
return SizedBox(
width: 40,
height: 50,
child: TextField(
controller: controllers[index],
focusNode: focusNodes[index],
textAlign: TextAlign.center,
keyboardType: TextInputType.number,
maxLength: 1,
decoration: InputDecoration(
counterText: '',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
),
),
onChanged: (value) {
if (value.isNotEmpty && index < 5) {
FocusScope.of(context).requestFocus(focusNodes[index + 1]);
}
},
),
);
}),
);
}
}
使用方法
SixDigitCodeInput(
onCompleted: (code) {
print('验证码输入完成: $code');
// 在这里处理验证码验证逻辑
},
)
功能特点
- 自动跳转:输入一个数字后自动跳到下一个输入框
- 删除处理:删除字符时会自动跳转到上一个输入框
- 完成回调:当6位都输入完成后会触发onCompleted回调
- 样式自定义:可以轻松修改TextField的装饰来改变外观
你可以根据需要调整输入框的样式、大小和间距,或者添加验证码错误时的视觉反馈。