import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:qadirneyriz/config/config.dart'; class OTPTextField extends StatefulWidget { final int length; final ValueChanged onSubmitted; const OTPTextField({ super.key, required this.length, required this.onSubmitted, }); @override _OTPTextFieldState createState() => _OTPTextFieldState(); } class _OTPTextFieldState extends State { late List focusNodes; late List controllers; @override void initState() { super.initState(); focusNodes = List.generate(widget.length, (index) => FocusNode()); controllers = List.generate(widget.length, (index) => TextEditingController()); } @override void dispose() { for (var controller in controllers) { controller.dispose(); } super.dispose(); } @override Widget build(BuildContext context) { return Directionality( textDirection: TextDirection.ltr, child: Row( children: List.generate( widget.length, (index) => Expanded( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 7), child: Center( child: TextFormField( cursorColor: config.ui.mainGreen, style: const TextStyle( color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20), controller: controllers[index], focusNode: focusNodes[index], keyboardType: TextInputType.number, textInputAction: index < widget.length - 1 ? TextInputAction.next : TextInputAction.done, inputFormatters: [ FilteringTextInputFormatter.allow(RegExp('[0-9]')) ], textAlign: TextAlign.center, // Center the text within the box. onChanged: (value) { if (value.length == 1) { if (index < widget.length - 1) { focusNodes[index].unfocus(); FocusScope.of(context) .requestFocus(focusNodes[index + 1]); } else { focusNodes[index].unfocus(); } } else if (value.isEmpty) { if (index > 0) { focusNodes[index].unfocus(); FocusScope.of(context) .requestFocus(focusNodes[index - 1]); } } if (isInputValid()) { String otp = controllers .map((controller) => controller.text) .join(); widget.onSubmitted(otp); } }, decoration: InputDecoration( fillColor: Colors.white.withOpacity(.5), filled: true, border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), // Add border radius ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide( color: config .ui.mainGreen, // Change focus color to yellow ), ))), ), ), ), ), ), ); } bool isInputValid() { return controllers.every((controller) => controller.text.length == 1); } }