BixatForm is a Flutter package designed to simplify form creation and management in Flutter applications. It provides a powerful and flexible solution for building reactive forms with built-in validation and state management.
- Reactive Forms: Create forms that automatically update based on user input and validation status.
- Built-in Validation: Implement custom validation logic for each form field.
- State Management: Easily manage form state transitions (enabled, loading, disabled, done).
- Flexible Data Retrieval: Get form data as needed through a unified API.
- Optional Fields: Support for optional fields that don't affect overall form validity.
- Exclude Fields: Ability to exclude certain fields from being included in the final data.
Add BixatForm to your Flutter project:
dependencies:
bixat_form: ^<latest_version>
Here's a basic example of how to use BixatForm:
import 'package:bixat_form/bixat_form.dart';
import 'package:flutter/material.dart';
class MyForm with BixatForm {
TextEditingController get usernameField =>
put('username', TextEditingController());
TextEditingController get passwordField =>
put('password', TextEditingController());
@override
List<String> get optionalFields => ['terms_accepted'];
@override
bool onValidate(dynamic e) {
if (e == null) return false;
final bool result = switch (e.runtimeType) {
TextEditingController => e.text.isNotEmpty,
_ => true,
};
return result;
}
}
class LoginFormUI extends StatelessWidget {
final bixatForm = BixatController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Login Form')),
body: Padding(
padding: EdgeInsets.all(16),
child: Column(
children: [
TextFormField(
controller: bixatForm.usernameField,
decoration: InputDecoration(labelText: 'Username'),
onChanged: bixatForm.onChanged,
),
SizedBox(height: 16),
TextFormField(
controller: bixatForm.passwordField,
obscureText: true,
decoration: InputDecoration(labelText: 'Password'),
onChanged: bixatForm.onChanged,
),
SizedBox(height: 16),
ValueListenableBuilder(
valueListenable: bixatForm.state,
builder: (context, _, __) {
return ElevatedButton(
onPressed: bixatForm.disabled ? null : bixatForm.submit,
child: Text(bixatForm.state.value == BixatFormState.loading
? 'Loading...'
: 'Login'),
);
},
),
],
),
),
);
}
}
Define optional fields that don't affect overall form validity:
class MyForm with BixatForm {
@override
List<String> get optionalFields => ['terms_accepted'];
}
Implement custom validation logic for each field:
@override
bool onValidate(dynamic e) {
if (e == null) return false;
final bool result = switch (e.runtimeType) {
TextEditingController => e.text.isNotEmpty,
_ => true,
};
return result;
}
Get form data as needed through a unified API:
MapEntry<String, dynamic> getData(String key, value) {
final result = switch (value.runtimeType) {
TextEditingController => value.text,
_ => value,
};
return MapEntry(key, result);
}
BixatForm manages three states:
- Enabled: Form is valid and ready for submission.
- Loading: Form is submitting data.
- Disabled: Form is invalid or disabled.
- Done: Submission completed successfully.
You can access the current state using:
final currentState = bixatForm.state.value;
Example of the submit function to handle form submission:
Future<void> submit() async {
state.value = BixatFormState.loading;
await Future.delayed(const Duration(seconds: 3));
state.value = BixatFormState.done;
log(data.toString());
await Future.delayed(const Duration(seconds: 1));
state.value = BixatFormState.enabled;
}
BixatForm simplifies form management in Flutter applications by providing a reactive, stateful, and customizable solution. It handles validation, state transitions, and data retrieval, allowing developers to focus on building intuitive and efficient forms.
Contributions are welcome! Please feel free to submit issues or pull requests.
This project is licensed under the MIT License - see the LICENSE.md file for details.