reusable_editor
A flexible and modular file management and form handling package for Flutter, supporting both Firestore and REST API-based storage systems along with comprehensive form field management. This package includes file operations, form state management using Cubits, and a collection of reusable form field widgets.
Features
- Abstract interfaces for clean architecture
- Cubits for managing form states (e.g., image, switch, dropdown, text field, multi-select)
- Complete set of reusable form field widgets
- Extensions for asset loading as
FileandUint8List - Enum-based dropdown and multi-select checkbox groups with icon and label support
Getting Started
Installation
Add the following to your pubspec.yaml:
dependencies:
reusable_editor: <latest_version>
Import
import 'package:reusable_editor/reusable_editor.dart';
📘 Documentation
Full usage guides available at: 👉 https://geniecodersrc.github.io/reusable_editor/
Available Form Widgets
AppCheckbox- Checkbox with label and validationAppDatePicker- Date selection fieldAppDropdown- Custom dropdown fieldAppFilePicker- File selection widgetAppRadioGroup- Radio button groupAppRangeSlider- Range slider inputAppSlider- Slider inputAppSwitch- Toggle switchAppTimePicker- Time selection fieldAppTextField- Text input fieldEnumOptionDropDownMenuFormField- Dropdown for Enum valuesEnumMultiOptionCheckboxGroup- Multi-select checkbox group for Enums
State Management Cubits
FieldCubit<T>- Generic form field management with validationToggleCubit- Specialized cubit for boolean toggle fieldsDateTimeCubit- Manages date selectionImageFieldCubit- Handles image pick logic and validationEnumOptionCubit<T>- Dropdown selection with generic enumMultiEnumOptionCubit<T>- Multi-select enum field managementSwitchCubit- Toggle logicTextFieldCubit- Text field validation
Usage
Form Field Management
// Text field
final textFieldCubit = TextFieldCubit(
initialValue: 'Default',
validator: RequiredValidator(),
);
AppTextField(cubit: textFieldCubit, label: 'Name');
// Toggle switch
final toggleCubit = ToggleCubit(initialValue: false);
AppSwitch(cubit: toggleCubit);
// Date picker
final dateCubit = FieldCubit<DateTime>(
validator: RequiredFieldValidator().call,
);
AppDatePicker(cubit: dateCubit, labelText: 'Select Date', formatter: DateFormat('yyyy-MM-dd'));
// Time picker
final timeCubit = FieldCubit<TimeOfDay>(
validator: RequiredFieldValidator().call,
);
AppTimePicker(cubit: timeCubit, labelText: 'Select Time');
// Slider
final sliderCubit = FieldCubit<double>(initialValue: 0.5);
AppSlider(cubit: sliderCubit, min: 0, max: 1, divisions: 10, labelText: 'Select Value', displayValue: (val) => val.toStringAsFixed(2));
// Range slider
final rangeSliderCubit = FieldCubit<RangeValues>(
initialValue: const RangeValues(0, 50),
);
AppRangeSlider(cubit: rangeSliderCubit, min: 0, max: 100, divisions: 20, labelText: 'Range');
// Checkbox
final checkboxCubit = ToggleCubit(initialValue: false);
AppCheckbox(cubit: checkboxCubit, label: 'Accept Terms');
// Radio Group
final radioCubit = FieldCubit<String>(initialValue: 'Male');
AppRadioGroup<String>(
cubit: radioCubit,
label: 'Gender',
values: const ['Male', 'Female', 'Other'],
labels: const ['Male', 'Female', 'Other'],
);
// File picker
final imageCubit = ImageFieldCubit();
AppFilePicker(cubit: imageCubit, labelText: 'Pick Image');
Dropdown with Enum
enum FileSourceType { firebase, server }
final dropdownCubit = EnumOptionCubit<FileSourceType>();
final dropdown = EnumOptionDropDownMenuFormField<FileSourceType>(
selectedValue: dropdownCubit.state.selectedOption,
onChanged: dropdownCubit.selectOption,
hint: 'Select file source',
dropdownItems: [
EnumOptionEntity(type: FileSourceType.firebase, icon: Icons.cloud, label: 'Firebase'),
EnumOptionEntity(type: FileSourceType.server, icon: Icons.storage, label: 'Server'),
],
);
Multi Select Enum (MultiEnumOptionCubit)
enum ReactionType { like, love, laugh, wow, sad, angry }
final reactionsCubit = MultiEnumOptionCubit<ReactionType>();
// Use the widget
EnumMultiOptionCheckboxGroup<ReactionType>(
cubit: reactionsCubit,
options: [
EnumOptionEntity(type: ReactionType.like, label: 'Like', icon: Icons.thumb_up),
EnumOptionEntity(type: ReactionType.love, label: 'Love', icon: Icons.favorite),
EnumOptionEntity(type: ReactionType.laugh, label: 'Laugh', icon: Icons.emoji_emotions),
EnumOptionEntity(type: ReactionType.wow, label: 'Wow', icon: Icons.sentiment_very_satisfied),
EnumOptionEntity(type: ReactionType.sad, label: 'Sad', icon: Icons.sentiment_dissatisfied),
EnumOptionEntity(type: ReactionType.angry, label: 'Angry', icon: Icons.sentiment_very_dissatisfied),
],
);
// Toggle selection
reactionsCubit.toggleOption(ReactionType.like);
// Replace all selections
reactionsCubit.setSelected([ReactionType.love, ReactionType.wow]);
// Read selected values
final selectedReactions = reactionsCubit.selectedTypes;
Load Asset as File
final file = await 'assets/image.png'.loadAsFile();
Load Asset as Bytes
final bytes = await 'assets/image.png'.loadAssetImage();
Contributions
Feel free to open issues or pull requests.
License
© MIT License. Developed with ❤️ by Shohidul Islam
Libraries
- application/manager/image_form_manager
- config/bloc_provider/register_reusable_editor_bloc_provider
- config/dependency_injection/register_input_fields_get_it_di
- domain/entities/enum_option_entity
- enums/file_data_source_type
- extensions/asset_image_to_file
- extensions/asset_to_xfile_extension
- extensions/image_loader
- reusable_editor
- styles/app_form_text_styles
- styles/form_input_styles
- type_def/type_def
- view_models/field_cubits/date_time_cubit/date_time_cubit
- view_models/field_cubits/enum_option_cubit/enum_option_cubit
- view_models/field_cubits/image_field_cubit/image_field_cubit
- view_models/field_cubits/multi_enum_option_cubit/multi_enum_option_cubit
- view_models/field_cubits/switch_cubit/switch_cubit
- view_models/field_cubits/text_field_cubit/text_field_cubit
- view_models/field_cubits/toggle_cubit/toggle_cubit
- view_models/generic_cubits/field_cubit/field_cubit
- views/widgets/app_input_fields/app_checkbox
- views/widgets/app_input_fields/app_date_picker
- views/widgets/app_input_fields/app_dropdown
- views/widgets/app_input_fields/app_file_picker
- views/widgets/app_input_fields/app_radio_group
- views/widgets/app_input_fields/app_range_slider
- views/widgets/app_input_fields/app_slider
- views/widgets/app_input_fields/app_switch
- views/widgets/app_input_fields/app_text_field
- views/widgets/app_input_fields/app_time_picker
- views/widgets/app_input_fields/enum_multi_option_checkbox_group
- views/widgets/app_input_fields/generic_text_field