欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

两种轻松实现 Flutter 验证码输入框的完美解决方案(Flutter 技巧系列 25)

最编程 2024-02-22 07:20:15
...
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();         }       },     ),   ); } }