leo_easy_ui_kit 0.1.0
leo_easy_ui_kit: ^0.1.0 copied to clipboard
Leo Easy UI Kit: effortless yet powerful Flutter UI components.
leo_easy_ui_kit #
Extremely easy APIs. Serious customization under the hood.
leo_easy_ui_kit is a reusable Flutter UI framework that standardizes value-driven widgets, delivers declarative integrations (ValueNotifier, Bloc, Provider, Hooks), and keeps APIs tiny without sacrificing power.
Every widget is generic-friendly (
<T>), null-safe, and production ready.
✨ Features #
- Clean base layer: shared typedefs, controllers, ChangeNotifiers, Bloc primitives.
- Built-in multi-select (
multiSelect: true/false) for every value widget that makes sense. - Simple + advanced widgets for every component (dropdown, checkbox, radio, switch, popup, bottom sheet, chips, table, text field, search).
- Built-in integrations: ValueNotifier, flutter_bloc, Provider, flutter_hooks.
- One-liner helpers via
easyDropdownOf,easyCheckboxOf,easyRadioOf,easySwitchOf,easyButtonGroupOf,easyChipsOf,easyPopupSelectOf,easyBottomSheetSelectOf,easyTextFieldOf,easySearchOf. - Fully customizable through builder callbacks, decoration/style factories, and animation hooks.
- Curated bottom sheets and dialogs for common flows (dropdowns, file pickers, image pickers, selectors).
🚀 Getting started #
- Add the dependency (pub.dev):
dependencies:
leo_easy_ui_kit: ^0.1.0
- Import the library:
import 'package:leo_easy_ui_kit/leo_easy_ui_kit.dart';
- Use the widgets you need (or the shortcuts).
🧱 Architecture #
lib/src/base/: shared contracts (EasyBaseWidget,EasySelectionController,EasyBloc,EasyValueNotifier).- Feature folders (
dropdown/,popup/, etc.) keep logic isolated and composable. leo_easy_ui_kit.dartre-exports everything for a single import.
💡 Usage (EasyDropdown) #
EasyDropdown<User>(
items: users,
value: selected,
itemBuilder: (context, user, isSelected) => Text(user.name),
onChanged: (user) => setState(() => selected = user),
);
EasyDropdownAdvanced<User>(
items: users,
placeholder: 'Pick owner',
multiSelect: true,
selectedValues: selectedMany,
onChangedMany: (values) => setState(() => selectedMany = values),
itemBuilder: (context, user, isSelected) => Row(
children: [
CircleAvatar(child: Text(user.initials)),
const SizedBox(width: 8),
Text(user.name),
],
),
decorationBuilder: (isOpen, hasValue) => BoxDecoration(
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: isOpen ? Colors.blue : Colors.grey.shade400,
),
),
);
EasyDropdownBloc<User>(
bloc: userBloc,
items: users,
itemBuilder: (context, user, _) => Text(user.name),
multiSelect: true,
);
File & image pickers #
EasyFilePicker<XFile>(
label: 'Upload attachments',
allowMultiple: true,
values: attachments,
onChangedMany: (files) => setState(() => attachments = files),
onPick: (category, allowMultiple) async {
// trigger preferred picker (file_picker, image_picker, etc.)
return await pickFiles(category, allowMultiple);
},
);
EasyImagePicker<XFile>(
allowMultiple: false,
value: avatar,
onChanged: (image) => setState(() => avatar = image),
onPick: (source, allowMultiple) async {
final images = await pickImages(source);
return images;
},
);
📚 Roadmap #
- Add example app with more real-world screens and layouts.
- Provide Riverpod variants where helpful.
- Extend theming utilities and presets for cohesive dashboards.
🛠 Contributing #
- Fork & clone.
- Run
flutter pub get. - Add tests & docs.
- Submit a pull request.
Issues and feature requests are welcome!