Flutter OTP Verification Screen Using Pin Input Field | PinInput Form Field Guide Flutter

Haris Bin Nasir Avatar

·

·

In today’s tutorial, I’m going to show you how to create a PIN input field in your Flutter application using the pinput package. By the end of this tutorial, you’ll have a functional PIN input field with validation and error handling. Let’s get started!

If you prefer watching a video tutorial here is a link to that.

Overview

We’ll build a simple verification screen where users can input a PIN code. The screen will include a heading, subheading, phone number display, and a PIN input field with validation. If the PIN is incorrect, an error message will be displayed.

Prerequisites

Before starting, ensure you have:

  • Flutter installed
  • Basic knowledge of Flutter and Dart

Setting Up the Project

Adding Dependencies

First, we need to add the pinput dependency to our project. Follow these steps:

  1. Copying Dependency from pub.dev:
    • Navigate to pub.dev and search for the pin input package.
    • Copy the latest version dependency.
    • To install the dependency click here.
  2. Adding Dependency to pubspec.yaml:
    • Open the pubspec.yaml file in your project.
    • Under the dependencies section, add the copied pin input dependency.
  3. Running flutter pub get:
    • Save the changes and run flutter pub get in your terminal. This will fetch the package and make it available in your project.
dependencies:
  flutter:
    sdk: flutter
      pinput: ^5.0.0
flutter pub get

Creating the Main Application File

Next, set up your main application file main.dart. This file initializes the app and sets up the main structure.

Importing Dependencies

Start by importing the necessary packages:

import 'package:flutter/material.dart';
import 'package:pin_input_tutorial/pages/home_page.dart';

Setting Up the Main Function

The main function initializes the app and sets up the main structure:

void main() {
  runApp(const MyApp());
}

Creating the MyApp Widget

Define the MyApp widget which returns a MaterialApp:

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      home: const HomePage(),
    );
  }
}

Creating the Home Page

Now, create the home page where the PIN input field will be implemented.

Setting Up the Home Page

Create a file home_page.dart for the home page.

Importing Dependencies

Start by importing the necessary packages:

import 'package:flutter/material.dart';
import 'package:pinput/pinput.dart';
Creating the Home Page Stateful Widget

Define the HomePage stateful widget:

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  GlobalKey<FormState> formKey = GlobalKey<FormState>();
  String validPin = "1234";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _buildUI(),
    );
  }
}

Building the UI

In the _HomePageState class, define the UI components.

Building the Main UI

The _buildUI method sets up the main layout of the screen:

Widget _buildUI() {
  return SafeArea(
    child: SizedBox.expand(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Column(
            children: [
              _headingText(),
              const SizedBox(height: 20),
              _subHeadingText(),
              const SizedBox(height: 20),
              _numberText(),
            ],
          ),
          _pinInputForm(),
          _resendCodeLink(),
        ],
      ),
    ),
  );
}

Adding the Heading Text

The _headingText method creates the heading text:

Widget _headingText() {
  return const Text(
    "Verification",
    style: TextStyle(
      fontWeight: FontWeight.w600,
      fontSize: 25,
    ),
  );
}

Adding the Subheading Text

The _subHeadingText method creates the subheading text:

Widget _subHeadingText() {
  return const Text(
    "Enter the code sent to the number",
    style: TextStyle(
      fontWeight: FontWeight.w300,
      fontSize: 15,
      color: Colors.black38,
    ),
  );
}

Displaying the Phone Number

The _numberText method displays the phone number:

Widget _numberText() {
  return const Text(
    "+1 723 563 0432",
    style: TextStyle(
      fontWeight: FontWeight.w500,
      fontSize: 15,
    ),
  );
}

The _resendCodeLink method creates the resend code link:

Widget _resendCodeLink() {
  return Text(
    "Didn't get the code.\nResend Code?",
    textAlign: TextAlign.center,
    style: TextStyle(
      fontWeight: FontWeight.w200,
      fontSize: 15,
      color: Theme.of(context).colorScheme.primary,
    ),
  );
}

Creating the PIN Input Form

Finally, create the PIN input form with validation:

Widget _pinInputForm() {
  return Form(
    key: formKey,
    child: Column(
      children: [
        Pinput(
          validator: (value) {
            return value == validPin ? null : "Pin is incorrect";
          },
          onCompleted: (pin) {
            print('Success: $pin');
          },
          errorBuilder: (errorText, pin) {
            return Padding(
              padding: const EdgeInsets.symmetric(vertical: 10.0),
              child: Center(
                child: Text(
                  errorText ?? "",
                  style: const TextStyle(color: Colors.red),
                ),
              ),
            );
          },
        ),
        TextButton(
          onPressed: () {
            formKey.currentState!.validate();
          },
          child: const Text('Validate'),
        ),
      ],
    ),
  );
}

Running the Application

With everything set up, run your application using flutter run. You should see a verification screen with a PIN input field. Enter the correct PIN to validate and proceed.

Get Source Code for free:

Conclusion

In this tutorial, we learned how to implement a PIN input field in a Flutter application using the pinput package. We created a verification screen with a heading, subheading, phone number display, and a PIN input field with validation. This approach provides a clean and efficient way to handle PIN inputs in your app.

Happy coding!

Leave a Reply

Your email address will not be published. Required fields are marked *