form_engine 0.0.2
form_engine: ^0.0.2 copied to clipboard
Headless, controller-free, declarative form engine for Flutter and Dart.
import 'package:flutter/material.dart';
import 'package:form_engine/form_engine.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(home: FormExamplePage());
}
}
class FormExamplePage extends StatefulWidget {
const FormExamplePage({super.key});
@override
State<FormExamplePage> createState() => _FormExamplePageState();
}
class _FormExamplePageState extends State<FormExamplePage> {
late final FormEngine form;
final emailController = TextEditingController();
final passwordController = TextEditingController();
@override
void initState() {
super.initState();
form = FormEngine(
schema: FormSchema(
fields: {
'email': FieldSchema<String>(
validators: const [RequiredValidator(), EmailValidator()],
),
'password': FieldSchema<String>(
validators: const [RequiredValidator(), MinLengthValidator(6)],
),
},
),
);
}
@override
void dispose() {
emailController.dispose();
passwordController.dispose();
super.dispose();
}
void _submit() {
setState(() {
form.updateValue('email', emailController.text);
form.updateValue('password', passwordController.text);
});
final isValid = form.validateAll();
if (isValid) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Form valid: ${form.state.values}')),
);
}
}
@override
Widget build(BuildContext context) {
final errors = form.state.errors;
return Scaffold(
appBar: AppBar(title: const Text('form_engine example')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
TextField(
controller: emailController,
decoration: InputDecoration(
labelText: 'Email',
errorText: errors['email'],
),
),
const SizedBox(height: 12),
TextField(
controller: passwordController,
obscureText: true,
decoration: InputDecoration(
labelText: 'Password',
errorText: errors['password'],
),
),
const SizedBox(height: 24),
ElevatedButton(onPressed: _submit, child: const Text('Submit')),
],
),
),
);
}
}