[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,
//
AstromicSelectorConfiguration? configuration,
bool isCustom = false,
//
double? itemSpacing = 4,
double? runSpacing = 8,
@@ -49,8 +50,25 @@ class AstromicSelectors {
required List<(T item, bool isEnabled)> items,
required Widget Function(T item, {bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped}) itemBuilder,
required Widget Function(T item) disabledItemBuilder,
}) =>
AstromicChipSelector(
Widget Function(List<Widget> items)? groupBuilder,
}) {
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,
onChanged: onChanged,
//
@@ -64,3 +82,4 @@ class AstromicSelectors {
disabledItemBuilder: disabledItemBuilder,
);
}
}

View File

@@ -25,6 +25,7 @@ class AstromicChipSelector<T> extends StatefulWidget {
final List<T>? initialSelectedValues;
final Function(List<T> selectedItems)? onChanged;
//s1 -- Configuration
final bool isCustom;
final AstromicSelectorConfiguration? configuration;
//s1 -- Style
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) disabledItemBuilder;
final Widget Function(List<Widget> items)? groupBuilder;
//!SECTION
//
AstromicChipSelector({
@@ -44,6 +46,7 @@ class AstromicChipSelector<T> extends StatefulWidget {
this.onChanged,
//s1 -- Configuration
this.configuration,
this.isCustom = false,
//s1 -- Style
this.itemSpacing = 8,
this.runSpacing = 8,
@@ -51,14 +54,53 @@ class AstromicChipSelector<T> extends StatefulWidget {
required this.items,
required this.itemBuilder,
required this.disabledItemBuilder,
this.groupBuilder,
}) : assert(
(configuration?.isNullable ?? true) || (initialSelectedValues != null && items.map((i) => i.$1).toList().containsAll(initialSelectedValues)),
"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(
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
State<AstromicChipSelector<T>> createState() => _AstromicChipSelectorState<T>();
}
@@ -172,7 +214,9 @@ class _AstromicChipSelectorState<T> extends State<AstromicChipSelector<T>> {
//!SECTION
//SECTION - Build Return
return _configuration.isWrap
return widget.isCustom && widget.groupBuilder != null
? widget.groupBuilder!(baseChildren)
: _configuration.isWrap
? Wrap(
spacing: widget.itemSpacing!,
runSpacing: widget.runSpacing!,