mobikul_flutter_form_validator 0.0.1
mobikul_flutter_form_validator: ^0.0.1 copied to clipboard
Enterprise-ready Flutter form validation foundation with planned sync, async, localized, and extensible validators.
import 'package:flutter/material.dart';
import 'package:mobikul_flutter_form_validator/mobikul_flutter_form_validator.dart';
void main() {
runApp(const MobikulValidatorExampleApp());
}
/// Runnable pub.dev example for the package.
final class MobikulValidatorExampleApp extends StatelessWidget {
/// Creates the example app.
const MobikulValidatorExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Mobikul Validator Example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF006B5F)),
useMaterial3: true,
),
home: const _ExampleHomeScreen(),
);
}
}
final class _ExampleHomeScreen extends StatefulWidget {
const _ExampleHomeScreen();
@override
State<_ExampleHomeScreen> createState() => _ExampleHomeScreenState();
}
final class _ExampleHomeScreenState extends State<_ExampleHomeScreen> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final TextEditingController _nameController = TextEditingController();
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
final TextEditingController _confirmPasswordController =
TextEditingController();
String _submitStatus = 'Complete the form and submit it.';
String _structuredSummary = 'Run the structured validation example.';
@override
void dispose() {
_nameController.dispose();
_emailController.dispose();
_passwordController.dispose();
_confirmPasswordController.dispose();
super.dispose();
}
void _submitBasicForm() {
final isValid = _formKey.currentState?.validate() ?? false;
setState(() {
_submitStatus = isValid
? 'The native Flutter form is valid.'
: 'Fix the highlighted fields.';
});
}
void _runStructuredExample() {
final form = DynamicValidationForm()
..register<String>(
DynamicValidationField<String>(
key: 'username',
label: 'Username',
value: '',
validators: [Validators.required<String>()],
),
)
..register<String>(
DynamicValidationField<String>(
key: 'email',
label: 'Email',
value: 'developer@example.com',
validators: [Validators.required<String>(), Validators.email()],
),
);
final summary = form.accessibilitySummary();
setState(() {
_structuredSummary = '${summary.errorCount} error needs attention. '
'First invalid field: ${summary.firstInvalidFieldKey}. '
'${summary.announcement}';
});
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Scaffold(
appBar: AppBar(title: const Text('Mobikul Validator Example')),
body: SafeArea(
child: SingleChildScrollView(
padding: const EdgeInsets.all(20),
child: Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 560),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'Native Flutter form',
style: theme.textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.w700,
),
),
const SizedBox(height: 12),
Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
TextFormField(
key: const ValueKey('name-field'),
controller: _nameController,
decoration: const InputDecoration(
labelText: 'Name',
border: OutlineInputBorder(),
),
textInputAction: TextInputAction.next,
validator: Validators.required<String>()
.toFlutterValidator(),
),
const SizedBox(height: 10),
TextFormField(
key: const ValueKey('email-field'),
controller: _emailController,
decoration: const InputDecoration(
labelText: 'Email',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
validator: Validators.compose<String>([
Validators.required<String>(),
Validators.email(),
]).toFlutterValidator(),
),
const SizedBox(height: 10),
TextFormField(
key: const ValueKey('password-field'),
controller: _passwordController,
decoration: const InputDecoration(
labelText: 'Password',
border: OutlineInputBorder(),
),
obscureText: true,
textInputAction: TextInputAction.next,
validator: Validators.compose<String>([
Validators.required<String>(),
Validators.password(
minLength: 8,
requireUppercase: true,
requireLowercase: true,
requireNumber: true,
requireSpecialCharacter: true,
),
]).toFlutterValidator(),
),
const SizedBox(height: 10),
TextFormField(
key: const ValueKey('confirm-password-field'),
controller: _confirmPasswordController,
decoration: const InputDecoration(
labelText: 'Confirm password',
border: OutlineInputBorder(),
),
obscureText: true,
textInputAction: TextInputAction.done,
validator: Validators.compose<String>([
Validators.required<String>(),
Validators.matchesField<String>('password'),
]).toFlutterValidator(
contextBuilder: () => ValidationContext(
values: {
'password': _passwordController.text,
},
),
),
),
const SizedBox(height: 12),
FilledButton(
key: const ValueKey('submit-basic-form'),
onPressed: _submitBasicForm,
child: const Text('Validate form'),
),
const SizedBox(height: 8),
Text(_submitStatus),
],
),
),
const SizedBox(height: 24),
Text(
'Structured validation',
style: theme.textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.w700,
),
),
const SizedBox(height: 8),
Text(_structuredSummary),
const SizedBox(height: 10),
OutlinedButton(
key: const ValueKey('run-structured-example'),
onPressed: _runStructuredExample,
child: const Text('Run structured validation'),
),
],
),
),
),
),
),
);
}
}