formio 1.0.0
formio: ^1.0.0 copied to clipboard
A comprehensive Flutter package for rendering Form.io forms with 92% feature parity - includes all components, validation, wizard forms, calculated values, and full API integration.
Form.io Flutter #
A comprehensive Flutter package for rendering Form.io forms with full feature parity.
Features #
✅ Complete Component Support (100%) #
All 41 Form.io components are fully implemented:
- Basic: TextField, TextArea, Number, Password, Email, URL, PhoneNumber, Tags, Address
- Advanced: DateTime, Day, Time, Currency, Survey
- Layout: Panel, Table, Tabs, Well, Columns, FieldSet, Container
- Data: Select, SelectBoxes, Checkbox, Radio, Button
- Special: File, Signature, Hidden, HTML, Content, Alert, Form
✅ Comprehensive Validation System #
- Required, Pattern (regex), Min/Max Length
- Min/Max Words, Min/Max Numeric Values
- Email, URL, JSON format validation
- Cross-field validation (password confirmation, field comparison)
- Config-driven validation with
FormioValidators.fromConfig()
✅ Advanced Form Features #
- Wizard Forms: Multi-page forms with navigation and progress tracking
- Calculated Values: Auto-calculated fields using JSONLogic expressions
- Conditional Logic: Show/hide components based on form data (Simple + JSONLogic)
- Default Values: Pre-populate form fields
- Data Grids: Editable table data
✅ Complete API Integration #
- Form CRUD operations
- Submission management
- User authentication
- Action handling
- Role-based access
Installation #
Add to your pubspec.yaml:
dependencies:
formio: ^1.0.0
Quick Start #
1. Basic Form Rendering #
import 'package:formio/formio.dart';
// Set your Form.io server URL
ApiClient.setBaseUrl(Uri.parse('https://examples.form.io'));
// Fetch and render a form
final formService = FormService(ApiClient());
final form = await formService.fetchForm('formPath');
// Display the form
FormRenderer(
form: form,
onSubmit: (data) => print('Submitted: $data'),
onError: (error) => print('Error: $error'),
)
2. Wizard (Multi-Page) Forms #
final wizardConfig = WizardConfig.fromJson({
'display': 'wizard',
'components': [
{
'type': 'panel',
'key': 'page1',
'label': 'Personal Info',
'components': [...]
},
{
'type': 'panel',
'key': 'page2',
'label': 'Address',
'components': [...]
},
]
});
WizardRenderer(
wizardConfig: wizardConfig,
onSubmit: (data) => print('Wizard completed: $data'),
showProgress: true,
)
3. Calculated Values #
ComponentModel.fromJson({
'type': 'currency',
'key': 'total',
'label': 'Total',
'calculateValue': {
'+': [
{'var': 'data.subtotal'},
{'var': 'data.tax'}
]
},
'allowCalculateOverride': false,
})
4. Cross-Field Validation #
// Password confirmation
ComponentModel.fromJson({
'type': 'password',
'key': 'confirmPassword',
'label': 'Confirm Password',
'validate': {
'required': true,
'matchField': 'password',
},
})
Advanced Usage #
Custom Validation #
TextFormField(
validator: (val) => FormioValidators.combine([
() => FormioValidators.required(val, fieldName: 'Email'),
() => FormioValidators.email(val),
() => FormioValidators.maxLength(val, 100),
]),
)
Conditional Logic #
Components support both simple and JSONLogic conditionals:
{
"conditional": {
"when": "country",
"eq": "USA",
"show": true
}
}
Or with JSONLogic:
{
"conditional": {
"json": {
"and": [
{"==": [{"var": "data.country"}, "USA"]},
{">": [{"var": "data.age"}, 18]}
]
}
}
}
Implementation Status #
| Feature Category | Coverage | Status |
|---|---|---|
| Components | 100% (41/41) | ✅ Complete |
| Validation | 95% | ✅ Complete |
| Wizard Forms | 100% | ✅ Complete |
| Calculated Values | 95% (JSONLogic) | ✅ Complete |
| Conditional Logic | 100% | ✅ Complete |
| API Integration | 100% | ✅ Complete |
Overall: ~92% Form.io feature parity
Architecture #
lib/
├── core/ # Core functionality
│ ├── validators.dart # Centralized validation
│ ├── calculation_evaluator.dart # Calculated values
│ ├── conditional_evaluator.dart # Conditional logic
│ └── utils.dart # Helper functions
├── models/ # Data models
│ ├── form.dart
│ ├── component.dart
│ └── wizard_config.dart
├── widgets/ # UI components
│ ├── form_renderer.dart
│ ├── wizard_renderer.dart
│ ├── component_factory.dart
│ └── components/ # All 41 components
├── services/ # API services
│ ├── form_service.dart
│ ├── submission_service.dart
│ └── auth_service.dart
└── network/
└── api_client.dart
Testing #
The package includes comprehensive test coverage:
flutter test
Test Results: 56/56 passing ✅
- Validator tests: 28/28
- Calculation tests: 13/13
- Cross-field validation: 15/15
Live Demo #
Run the example app to test with real forms:
cd example
flutter run
The demo loads forms from a live Form.io server and demonstrates all features.
Limitations #
JavaScript Expressions #
Custom JavaScript code is not supported. Use JSONLogic instead:
❌ Not Supported:
"calculateValue": "value = data.price * data.quantity"
✅ Use JSONLogic:
"calculateValue": {
"*": [
{"var": "data.price"},
{"var": "data.quantity"}
]
}
Not Implemented (Low Priority) #
- PDF generation (backend feature)
- Unique validation via API
- File upload to external providers (S3, Azure)
- Google Places autocomplete
Contributing #
Contributions are welcome! Please read our contributing guidelines.
License #
MIT License - see LICENSE file for details.
Support #
Credits #
Built with ❤️ for the Flutter community.
Form.io is a trademark of Form.io, Inc.