[DEV] Added Custom Chip Selector

This commit is contained in:
2024-05-16 18:22:23 +03:00
parent b8b16af1ad
commit 6e7923eede
2 changed files with 105 additions and 42 deletions

View File

@@ -37,6 +37,7 @@ class AstromicSelectors {
void Function(List<T> selectedItems)? onChanged, void Function(List<T> selectedItems)? onChanged,
// //
AstromicSelectorConfiguration? configuration, AstromicSelectorConfiguration? configuration,
bool isCustom = false,
// //
double? itemSpacing = 4, double? itemSpacing = 4,
double? runSpacing = 8, double? runSpacing = 8,
@@ -49,8 +50,25 @@ class AstromicSelectors {
required List<(T item, bool isEnabled)> items, required List<(T item, bool isEnabled)> items,
required Widget Function(T item, {bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped}) itemBuilder, required Widget Function(T item, {bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped}) itemBuilder,
required Widget Function(T item) disabledItemBuilder, required Widget Function(T item) disabledItemBuilder,
}) => Widget Function(List<Widget> items)? groupBuilder,
AstromicChipSelector( }) {
assert(
(!isCustom || groupBuilder != null),
"You have to provide the group builder in a custom constructor.",
);
return isCustom
? AstromicChipSelector.custom(
initialSelectedValues: initialSelectedValues,
onChanged: onChanged,
//
configuration: configuration,
//
items: items,
itemBuilder: itemBuilder,
disabledItemBuilder: disabledItemBuilder,
groupBuilder: groupBuilder!,
)
: AstromicChipSelector(
initialSelectedValues: initialSelectedValues, initialSelectedValues: initialSelectedValues,
onChanged: onChanged, onChanged: onChanged,
// //
@@ -63,4 +81,5 @@ class AstromicSelectors {
itemBuilder: itemBuilder, itemBuilder: itemBuilder,
disabledItemBuilder: disabledItemBuilder, disabledItemBuilder: disabledItemBuilder,
); );
}
} }

View File

@@ -25,6 +25,7 @@ class AstromicChipSelector<T> extends StatefulWidget {
final List<T>? initialSelectedValues; final List<T>? initialSelectedValues;
final Function(List<T> selectedItems)? onChanged; final Function(List<T> selectedItems)? onChanged;
//s1 -- Configuration //s1 -- Configuration
final bool isCustom;
final AstromicSelectorConfiguration? configuration; final AstromicSelectorConfiguration? configuration;
//s1 -- Style //s1 -- Style
final double? itemSpacing; final double? itemSpacing;
@@ -35,6 +36,7 @@ class AstromicChipSelector<T> extends StatefulWidget {
// //
final Widget Function(T item, {bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped}) itemBuilder; final Widget Function(T item, {bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped}) itemBuilder;
final Widget Function(T item) disabledItemBuilder; final Widget Function(T item) disabledItemBuilder;
final Widget Function(List<Widget> items)? groupBuilder;
//!SECTION //!SECTION
// //
AstromicChipSelector({ AstromicChipSelector({
@@ -44,6 +46,7 @@ class AstromicChipSelector<T> extends StatefulWidget {
this.onChanged, this.onChanged,
//s1 -- Configuration //s1 -- Configuration
this.configuration, this.configuration,
this.isCustom = false,
//s1 -- Style //s1 -- Style
this.itemSpacing = 8, this.itemSpacing = 8,
this.runSpacing = 8, this.runSpacing = 8,
@@ -51,14 +54,53 @@ class AstromicChipSelector<T> extends StatefulWidget {
required this.items, required this.items,
required this.itemBuilder, required this.itemBuilder,
required this.disabledItemBuilder, required this.disabledItemBuilder,
this.groupBuilder,
}) : assert( }) : assert(
(configuration?.isNullable ?? true) || (initialSelectedValues != null && items.map((i) => i.$1).toList().containsAll(initialSelectedValues)), (configuration?.isNullable ?? true) || (initialSelectedValues != null && items.map((i) => i.$1).toList().containsAll(initialSelectedValues)),
"Initial values are not all present in the items!", "Initial values are not all present in the items!",
), ),
assert(
(!isCustom || groupBuilder != null),
"You have to provide the group builder in a custom constructor.",
),
super( super(
key: key, key: key,
); );
static AstromicChipSelector custom<T>({
Key? key,
//s1 -- Functionality
final List<T>? initialSelectedValues,
final Function(List<T> selectedItems)? onChanged,
//s1 -- Configuration
final AstromicSelectorConfiguration? configuration,
//s1 -- Content
required final List<(T item, bool isEnabled)> items,
//
required final Widget Function(T item, {bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped}) itemBuilder,
required final Widget Function(T item) disabledItemBuilder,
required final Widget Function(List<Widget> items) groupBuilder,
}) {
assert((configuration?.isNullable ?? true) || (initialSelectedValues != null && items.map((i) => i.$1).toList().containsAll(initialSelectedValues)),
"Initial values are not all present in the items!");
//
return AstromicChipSelector<T>(
key: key,
isCustom: true,
//
initialSelectedValues: initialSelectedValues,
onChanged: onChanged,
//
configuration: configuration,
//
items: items,
itemBuilder: itemBuilder,
disabledItemBuilder: disabledItemBuilder,
groupBuilder: groupBuilder,
);
}
@override @override
State<AstromicChipSelector<T>> createState() => _AstromicChipSelectorState<T>(); State<AstromicChipSelector<T>> createState() => _AstromicChipSelectorState<T>();
} }
@@ -172,7 +214,9 @@ class _AstromicChipSelectorState<T> extends State<AstromicChipSelector<T>> {
//!SECTION //!SECTION
//SECTION - Build Return //SECTION - Build Return
return _configuration.isWrap return widget.isCustom && widget.groupBuilder != null
? widget.groupBuilder!(baseChildren)
: _configuration.isWrap
? Wrap( ? Wrap(
spacing: widget.itemSpacing!, spacing: widget.itemSpacing!,
runSpacing: widget.runSpacing!, runSpacing: widget.runSpacing!,