uz_document_validator 0.1.0
uz_document_validator: ^0.1.0 copied to clipboard
Comprehensive validator and formatter for Uzbekistan documents — PINFL/JSHSHIR, passport, INN/STIR, phone numbers, and license plates.
import 'package:flutter/material.dart';
import 'package:uz_document_validator/uz_document_validator.dart';
void main() => runApp(const ExampleApp());
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'uz_document_validator example',
theme: ThemeData(
colorSchemeSeed: Colors.indigo,
useMaterial3: true,
),
home: const ValidatorDemoPage(),
);
}
}
class ValidatorDemoPage extends StatefulWidget {
const ValidatorDemoPage({super.key});
@override
State<ValidatorDemoPage> createState() => _ValidatorDemoPageState();
}
class _ValidatorDemoPageState extends State<ValidatorDemoPage> {
final _formKey = GlobalKey<FormState>();
final _pinflCtrl = TextEditingController();
final _passportCtrl = TextEditingController();
final _innCtrl = TextEditingController();
final _phoneCtrl = TextEditingController();
String? _pinflInfo;
String? _phoneOperator;
@override
void dispose() {
_pinflCtrl.dispose();
_passportCtrl.dispose();
_innCtrl.dispose();
_phoneCtrl.dispose();
super.dispose();
}
void _validateAll() {
final isValid = _formKey.currentState?.validate() ?? false;
setState(() {
final info = UzValidator.parsePinfl(_pinflCtrl.text);
_pinflInfo = info == null
? null
: 'Jins: ${info.gender}, '
'Tug\'ilgan: ${info.birthDate.toIso8601String().substring(0, 10)}, '
'Hudud: ${info.regionCode}';
_phoneOperator = UzValidator.getPhoneOperator(_phoneCtrl.text);
});
if (isValid) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Barcha hujjatlar valid!')),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Uz Document Validator')),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Form(
key: _formKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
TextFormField(
controller: _pinflCtrl,
decoration: const InputDecoration(
labelText: 'PINFL / JSHSHIR',
hintText: '14 ta raqam',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.number,
inputFormatters: [PinflFormatter()],
validator: (v) {
final r = UzValidator.pinfl(v ?? '');
return r.isValid ? null : r.errorMessage;
},
),
if (_pinflInfo != null) ...[
const SizedBox(height: 8),
Text(_pinflInfo!, style: const TextStyle(color: Colors.green)),
],
const SizedBox(height: 16),
TextFormField(
controller: _passportCtrl,
decoration: const InputDecoration(
labelText: 'Pasport',
hintText: 'AA 1234567',
border: OutlineInputBorder(),
),
inputFormatters: [PassportFormatter()],
validator: (v) {
final r = UzValidator.passport(v ?? '');
return r.isValid ? null : r.errorMessage;
},
),
const SizedBox(height: 16),
TextFormField(
controller: _innCtrl,
decoration: const InputDecoration(
labelText: 'INN / STIR',
hintText: '9 ta raqam',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.number,
validator: (v) {
final r = UzValidator.inn(v ?? '');
return r.isValid ? null : r.errorMessage;
},
),
const SizedBox(height: 16),
TextFormField(
controller: _phoneCtrl,
decoration: const InputDecoration(
labelText: 'Telefon',
hintText: '+998 90 123 45 67',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.phone,
inputFormatters: [UzPhoneFormatter()],
validator: (v) {
final r = UzValidator.phone(v ?? '');
return r.isValid ? null : r.errorMessage;
},
),
if (_phoneOperator != null) ...[
const SizedBox(height: 8),
Text('Operator: $_phoneOperator',
style: const TextStyle(color: Colors.green)),
],
const SizedBox(height: 24),
FilledButton(
onPressed: _validateAll,
child: const Text('Tekshirish'),
),
],
),
),
),
);
}
}