form_bloc_allenlinli 0.36.1
form_bloc_allenlinli: ^0.36.1 copied to clipboard
Core package for form_bloc, providing form state management and validation.
import 'package:flutter/material.dart';
import 'package:flutter_form_bloc_allenlinli/flutter_form_bloc_allenlinli.dart';
class LoginFormBloc extends FormBloc<String, String> {
final email = TextFieldBloc<dynamic>(
validators: [
FieldBlocValidators.required,
FieldBlocValidators.email,
],
);
final password = TextFieldBloc<dynamic>(
validators: [
FieldBlocValidators.required,
],
);
LoginFormBloc() {
addFieldBlocs(
fieldBlocs: [
email,
password,
],
);
}
@override
void onSubmitting() {
print(email.value);
print(password.value);
emitSuccess();
}
}
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (context) => LoginFormBloc(),
child: const LoginFormScreen(),
),
);
}
}
class LoginFormScreen extends StatelessWidget {
const LoginFormScreen({super.key});
@override
Widget build(BuildContext context) {
final formBloc = BlocProvider.of<LoginFormBloc>(context);
return Scaffold(
appBar: AppBar(title: const Text('Login Form')),
body: FormBlocListener<LoginFormBloc, String, String>(
onSuccess: (context, state) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Login Success!')),
);
},
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextFieldBlocBuilder(
textFieldBloc: formBloc.email,
decoration: const InputDecoration(
labelText: 'Email',
prefixIcon: Icon(Icons.email),
),
),
TextFieldBlocBuilder(
textFieldBloc: formBloc.password,
decoration: const InputDecoration(
labelText: 'Password',
prefixIcon: Icon(Icons.lock),
),
obscureText: true,
),
const SizedBox(height: 24),
ElevatedButton(
onPressed: formBloc.submit,
child: const Text('Login'),
),
],
),
),
),
);
}
}