nepali_input_formatters 0.0.1
nepali_input_formatters: ^0.0.1 copied to clipboard
A collection of Flutter TextInputFormatters, validators, and utilities tailored for Nepali data formats (phone numbers, citizenship, and Lakhs/Crores currency).
import 'package:flutter/material.dart';
import 'package:nepali_input_formatters/nepali_input_formatters.dart';
void main() => runApp(const ExampleApp());
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Nepali Input Formatters Example',
theme: ThemeData(colorSchemeSeed: Colors.indigo, useMaterial3: true),
home: const FormattersDemoPage(),
);
}
}
class FormattersDemoPage extends StatefulWidget {
const FormattersDemoPage({super.key});
@override
State<FormattersDemoPage> createState() => _FormattersDemoPageState();
}
class _FormattersDemoPageState extends State<FormattersDemoPage> {
final _formKey = GlobalKey<FormState>();
final _phoneController = TextEditingController();
final _citizenshipController = TextEditingController();
final _currencyController = TextEditingController();
NepaliTelecom _telecom = NepaliTelecom.unknown;
@override
void dispose() {
_phoneController.dispose();
_citizenshipController.dispose();
_currencyController.dispose();
super.dispose();
}
void _onSubmit() {
if (_formKey.currentState!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('All fields are valid.')),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Nepali Input Formatters'),
centerTitle: true,
),
body: Form(
key: _formKey,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
spacing: 12,
children: [
TextFormField(
controller: _phoneController,
keyboardType: TextInputType.phone,
inputFormatters: const [NepaliPhoneNumberFormatter()],
validator: validateNepaliPhoneNumber,
onChanged: (value) {
final digits = value.replaceAll(RegExp(r'[^0-9]'), '');
setState(() => _telecom = identifyNepaliTelecom(digits));
},
decoration: InputDecoration(
labelText: 'Mobile number',
hintText: '984-123-4567',
border: const OutlineInputBorder(),
helperText: _telecom == NepaliTelecom.unknown
? null
: 'Detected operator: ${_telecom.name.toUpperCase()}',
),
),
TextFormField(
controller: _citizenshipController,
keyboardType: TextInputType.number,
inputFormatters: const [CitizenshipNumberFormatter()],
validator: validateCitizenshipNumber,
decoration: const InputDecoration(
labelText: 'Citizenship number',
hintText: '12-01-70-12345',
border: OutlineInputBorder(),
),
),
TextFormField(
controller: _currencyController,
keyboardType: TextInputType.number,
inputFormatters: const [SouthAsianCurrencyFormatter()],
validator: validateCurrencyAmount,
decoration: const InputDecoration(
labelText: 'Amount (NPR)',
hintText: '12,34,567',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 12),
FilledButton(
onPressed: _onSubmit,
child: const Text('Validate'),
),
],
),
),
),
);
}
}