This commit is contained in:
2025-02-12 14:20:11 +02:00
parent 7d3920bb95
commit 2f77d5d813
28 changed files with 448 additions and 420 deletions

View File

@@ -45,7 +45,7 @@ class AstromicSelectors {
required Widget Function(T item, bool isEnabled, bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped) itemBuilder,
Widget Function(List<Widget> items)? groupBuilder,
}) =>
AstromicChipSelector(
AstromicChipSelector<T>(
initialSelectedValues: initialSelectedValues,
onChanged: onChanged,
configuration: configuration,
@@ -53,6 +53,6 @@ class AstromicSelectors {
runSpacing: runSpacing,
items: items,
itemBuilder: itemBuilder,
groupBuilder: groupBuilder!,
groupBuilder: groupBuilder,
);
}

View File

@@ -13,20 +13,6 @@ import 'models/models.exports.dart';
/// Selector that allows multible items to be selected from a group of items with the option to unselect and clear.
class AstromicChipSelector<T> extends StatefulWidget {
//SECTION - Widget Arguments
//s1 -- Functionality
final List<T>? initialSelectedValues;
final Function(List<T> selectedItems)? onChanged;
//s1 -- Configuration
final AstromicChipSelectorConfiguration? configuration;
//s1 -- Style
final double? itemSpacing;
final double? runSpacing;
//
//s1 -- Content
final List<(T item, bool isEnabled)> items;
final Widget Function(T item, bool isEnabled, bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped) itemBuilder;
final Widget Function(List<Widget> items)? groupBuilder;
//!SECTION
//
AstromicChipSelector({
@@ -44,12 +30,26 @@ class AstromicChipSelector<T> extends StatefulWidget {
required this.itemBuilder,
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!",
(configuration?.isNullable ?? true) || (initialSelectedValues != null && items.map(((T, bool) i) => i.$1).toList().containsAll(initialSelectedValues)),
'Initial values are not all present in the items!',
),
super(
key: key,
);
//SECTION - Widget Arguments
//s1 -- Functionality
final List<T>? initialSelectedValues;
final Function(List<T> selectedItems)? onChanged;
//s1 -- Configuration
final AstromicChipSelectorConfiguration? configuration;
//s1 -- Style
final double? itemSpacing;
final double? runSpacing;
//
//s1 -- Content
final List<(T item, bool isEnabled)> items;
final Widget Function(T item, bool isEnabled, bool isSelected, VoidCallback? onTap, VoidCallback? onClearTapped) itemBuilder;
final Widget Function(List<Widget> items)? groupBuilder;
@override
State<AstromicChipSelector<T>> createState() => _AstromicChipSelectorState<T>();
@@ -80,7 +80,7 @@ class _AstromicChipSelectorState<T> extends State<AstromicChipSelector<T>> {
//s1 --Controllers & Listeners
//
//s1 --State
selectedItems = widget.initialSelectedValues ?? [];
selectedItems = widget.initialSelectedValues ?? <T>[];
//s1 --State
//
//s1 --Late & Async Initializers
@@ -126,7 +126,7 @@ class _AstromicChipSelectorState<T> extends State<AstromicChipSelector<T>> {
//s1 -Values
//
//s1 -Widgets
List<Widget> baseChildren = widget.items.map((currentItem) {
List<Widget> baseChildren = widget.items.map(((T, bool) currentItem) {
//
AstromicChipSelectorConfiguration configuration = widget.configuration ?? const AstromicChipSelectorConfiguration();
//

View File

@@ -3,15 +3,6 @@ import 'package:flutter/widgets.dart';
/// Configuration model for the chip selector element.
class AstromicChipSelectorConfiguration {
final bool isNullable;
final bool isWrap;
final WrapAlignment wrapMainAllignment;
final WrapCrossAlignment wrapCrossAllignment;
final bool isConsequent;
final bool withClearButton;
final int maxSelectedItems;
final int crossAxisCount;
final double? fixedRowHeight;
const AstromicChipSelectorConfiguration({
this.isNullable = true,
//
@@ -24,6 +15,15 @@ class AstromicChipSelectorConfiguration {
this.crossAxisCount = 3,
this.fixedRowHeight,
});
final bool isNullable;
final bool isWrap;
final WrapAlignment wrapMainAllignment;
final WrapCrossAlignment wrapCrossAllignment;
final bool isConsequent;
final bool withClearButton;
final int maxSelectedItems;
final int crossAxisCount;
final double? fixedRowHeight;
AstromicChipSelectorConfiguration copyWith({
bool? isNullable,

View File

@@ -2,12 +2,6 @@ import 'package:flutter/widgets.dart';
/// Configuration model for the radio selector element.
class AstromicRadioSelectorConfiguration {
final Axis axis;
final bool isNullable;
//
final MainAxisAlignment? mainAxisAlignment;
final MainAxisSize? mainAxisSize;
final CrossAxisAlignment? crossAxisAlignment;
const AstromicRadioSelectorConfiguration({
this.axis = Axis.horizontal,
this.isNullable = true,
@@ -16,6 +10,12 @@ class AstromicRadioSelectorConfiguration {
this.mainAxisSize,
this.crossAxisAlignment,
});
final Axis axis;
final bool isNullable;
//
final MainAxisAlignment? mainAxisAlignment;
final MainAxisSize? mainAxisSize;
final CrossAxisAlignment? crossAxisAlignment;
AstromicRadioSelectorConfiguration copyWith({
Axis? axis,

View File

@@ -12,17 +12,6 @@ import 'models/models.exports.dart';
/// Selector that allows only one item to be selected from a group of items.
class AstromicRadioSelector<T> extends StatefulWidget {
//SECTION - Widget Arguments
//s1 -- Functionality
final T? initialSelectedValue;
final Function(T selectedItem)? onChanged;
//s1 -- Configuration
final AstromicRadioSelectorConfiguration? configuration;
//s1 -- Style
final double? itemSpacing;
//s1 -- Content
final List<(T item, bool isEnabled)> items;
final Widget Function(T item, bool isEnabled, bool isSelected, VoidCallback? onTap) itemBuilder;
//!SECTION
//
AstromicRadioSelector({
@@ -42,16 +31,27 @@ class AstromicRadioSelector<T> extends StatefulWidget {
configuration!.isNullable ||
(items
.map(
(e) => e.$1,
((T, bool) e) => e.$1,
)
.toList()
.contains(initialSelectedValue) &&
items.where((e) => e.$1 == initialSelectedValue).first.$2),
"Initial value is not present in the items or is not enabled!",
items.where(((T, bool) e) => e.$1 == initialSelectedValue).first.$2),
'Initial value is not present in the items or is not enabled!',
),
super(
key: key,
);
//SECTION - Widget Arguments
//s1 -- Functionality
final T? initialSelectedValue;
final Function(T selectedItem)? onChanged;
//s1 -- Configuration
final AstromicRadioSelectorConfiguration? configuration;
//s1 -- Style
final double? itemSpacing;
//s1 -- Content
final List<(T item, bool isEnabled)> items;
final Widget Function(T item, bool isEnabled, bool isSelected, VoidCallback? onTap) itemBuilder;
@override
State<AstromicRadioSelector<T>> createState() => _AstromicRadioSelectorState<T>();
@@ -116,7 +116,7 @@ class _AstromicRadioSelectorState<T> extends State<AstromicRadioSelector<T>> {
//s1 -Values
//
//s1 -Widgets
List<Widget> baseChildren = widget.items.map((currentItem) {
List<Widget> baseChildren = widget.items.map(((T, bool) currentItem) {
T item = currentItem.$1;
bool isEnabled = currentItem.$2;
bool isSelected = item == selectedItem;