[DEV] Added Custom Chip Selector
This commit is contained in:
@@ -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,18 +50,36 @@ 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(
|
}) {
|
||||||
initialSelectedValues: initialSelectedValues,
|
assert(
|
||||||
onChanged: onChanged,
|
(!isCustom || groupBuilder != null),
|
||||||
//
|
"You have to provide the group builder in a custom constructor.",
|
||||||
configuration: configuration,
|
);
|
||||||
//
|
return isCustom
|
||||||
itemSpacing: itemSpacing,
|
? AstromicChipSelector.custom(
|
||||||
runSpacing: runSpacing,
|
initialSelectedValues: initialSelectedValues,
|
||||||
//
|
onChanged: onChanged,
|
||||||
items: items,
|
//
|
||||||
itemBuilder: itemBuilder,
|
configuration: configuration,
|
||||||
disabledItemBuilder: disabledItemBuilder,
|
//
|
||||||
);
|
items: items,
|
||||||
|
itemBuilder: itemBuilder,
|
||||||
|
disabledItemBuilder: disabledItemBuilder,
|
||||||
|
groupBuilder: groupBuilder!,
|
||||||
|
)
|
||||||
|
: AstromicChipSelector(
|
||||||
|
initialSelectedValues: initialSelectedValues,
|
||||||
|
onChanged: onChanged,
|
||||||
|
//
|
||||||
|
configuration: configuration,
|
||||||
|
//
|
||||||
|
itemSpacing: itemSpacing,
|
||||||
|
runSpacing: runSpacing,
|
||||||
|
//
|
||||||
|
items: items,
|
||||||
|
itemBuilder: itemBuilder,
|
||||||
|
disabledItemBuilder: disabledItemBuilder,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,34 +214,36 @@ class _AstromicChipSelectorState<T> extends State<AstromicChipSelector<T>> {
|
|||||||
//!SECTION
|
//!SECTION
|
||||||
|
|
||||||
//SECTION - Build Return
|
//SECTION - Build Return
|
||||||
return _configuration.isWrap
|
return widget.isCustom && widget.groupBuilder != null
|
||||||
? Wrap(
|
? widget.groupBuilder!(baseChildren)
|
||||||
spacing: widget.itemSpacing!,
|
: _configuration.isWrap
|
||||||
runSpacing: widget.runSpacing!,
|
? Wrap(
|
||||||
//
|
spacing: widget.itemSpacing!,
|
||||||
alignment: _configuration.wrapMainAllignment,
|
runSpacing: widget.runSpacing!,
|
||||||
crossAxisAlignment: _configuration.wrapCrossAllignment,
|
//
|
||||||
//
|
alignment: _configuration.wrapMainAllignment,
|
||||||
children: baseChildren,
|
crossAxisAlignment: _configuration.wrapCrossAllignment,
|
||||||
)
|
//
|
||||||
: GridView.builder(
|
children: baseChildren,
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
)
|
||||||
controller: _scrollController,
|
: GridView.builder(
|
||||||
shrinkWrap: true,
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
padding: EdgeInsets.zero,
|
controller: _scrollController,
|
||||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
shrinkWrap: true,
|
||||||
mainAxisExtent: _configuration.fixedRowHeight,
|
padding: EdgeInsets.zero,
|
||||||
// number of items per row
|
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
crossAxisCount: widget.configuration?.crossAxisCount ?? 1,
|
mainAxisExtent: _configuration.fixedRowHeight,
|
||||||
// vertical spacing between the items
|
// number of items per row
|
||||||
mainAxisSpacing: widget.runSpacing!,
|
crossAxisCount: widget.configuration?.crossAxisCount ?? 1,
|
||||||
// the horizontal spacing between the items
|
// vertical spacing between the items
|
||||||
crossAxisSpacing: widget.itemSpacing!,
|
mainAxisSpacing: widget.runSpacing!,
|
||||||
),
|
// the horizontal spacing between the items
|
||||||
// number of items in your list
|
crossAxisSpacing: widget.itemSpacing!,
|
||||||
itemCount: baseChildren.length,
|
),
|
||||||
itemBuilder: (BuildContext context, int index) => baseChildren[index],
|
// number of items in your list
|
||||||
);
|
itemCount: baseChildren.length,
|
||||||
|
itemBuilder: (BuildContext context, int index) => baseChildren[index],
|
||||||
|
);
|
||||||
//!SECTION
|
//!SECTION
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user