[DEV] done with the Radio Selectors

This commit is contained in:
2024-05-14 16:05:17 +03:00
parent 4b1bcc7b5c
commit a8bc1fce9a
2 changed files with 53 additions and 45 deletions

View File

@@ -1,6 +1,7 @@
//s2 Core Packages Imports //s2 Core Packages Imports
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'src/configuration.dart';
import 'src/radio.selector.dart';
class AstromicSelectors { class AstromicSelectors {
//S1 -- Radio //S1 -- Radio
@@ -12,17 +13,17 @@ class AstromicSelectors {
// //
double? itemSpacing = 4, double? itemSpacing = 4,
// //
required Widget Function(AstromicRadioSelectorItem<T> item, VoidCallback? onTap, bool isSelected) itemBuilder, required Widget Function(T item, {VoidCallback? onTap, bool isSelected}) itemBuilder,
Widget Function(AstromicRadioSelectorItem<T> item)? disabledItemBuilder, Widget Function(T item)? disabledItemBuilder,
required List<AstromicRadioSelectorItem<T>> items, required List<(T item, bool isEnabled)> items,
}) => }) =>
astromicRadioSelector<T>( AstromicRadioSelector<T>(
initialSelectedValue: initialSelectedValue, initialSelectedValue: initialSelectedValue,
onChanged: onChanged, onChanged: onChanged,
// //
configurations: configurations, configurations: configurations ?? const AstromicSelectorConfiguration(),
// //
itemSpacing: itemSpacing, itemSpacing: itemSpacing ?? 8.0,
// //
itemBuilder: itemBuilder, itemBuilder: itemBuilder,
disabledItemBuilder: disabledItemBuilder, disabledItemBuilder: disabledItemBuilder,

View File

@@ -10,6 +10,7 @@ import 'package:flutter/widgets.dart';
//--------------- //---------------
//s2 SERVICES //s2 SERVICES
//s2 MODELS //s2 MODELS
import '../../Spacing/spacing.astromic.dart';
import 'configuration.dart'; import 'configuration.dart';
//s2 MISC //s2 MISC
//!SECTION - Imports //!SECTION - Imports
@@ -25,14 +26,14 @@ class AstromicRadioSelector<T> extends StatefulWidget {
final T? initialSelectedValue; final T? initialSelectedValue;
final Function(T selectedItem)? onChanged; final Function(T selectedItem)? onChanged;
//s1 -- Configuration //s1 -- Configuration
final AstromicSelectorConfiguration? configurations; final AstromicSelectorConfiguration configurations;
//s1 -- Style //s1 -- Style
final double? itemSpacing; final double itemSpacing;
//s1 -- Content //s1 -- Content
final List<AstromicRadioSelectorItem<T>> items; final List<(T item, bool isEnabled)> items;
// //
final Widget Function(AstromicRadioSelectorItem<T> item, VoidCallback? onTap, bool isSelected) itemBuilder; final Widget Function(T item, {VoidCallback? onTap, bool isSelected}) itemBuilder;
final Widget Function(AstromicRadioSelectorItem<T> item)? disabledItemBuilder; final Widget Function(T item)? disabledItemBuilder;
//!SECTION //!SECTION
// //
AstromicRadioSelector({ AstromicRadioSelector({
@@ -42,22 +43,23 @@ class AstromicRadioSelector<T> extends StatefulWidget {
required this.items, required this.items,
this.onChanged, this.onChanged,
//s1 -- Configuration //s1 -- Configuration
this.configurations = const AstromicSelectorConfiguration(), required this.configurations,
//s1 -- Style //s1 -- Style
this.itemSpacing = 8, required this.itemSpacing,
//s1 -- Content //s1 -- Content
required this.itemBuilder, required this.itemBuilder,
this.disabledItemBuilder, this.disabledItemBuilder,
}) : assert(configurations!.isNullable || initialSelectedValue != null, 'You need to supply an initial value if not nullable!'), }) : assert(configurations.isNullable || initialSelectedValue != null, 'You need to supply an initial value if not nullable!'),
assert( assert(
configurations!.isNullable || configurations.isNullable ||
(items (items
.map( .map(
(e) => e.value, (e) => e.$1,
) )
.toList() .toList()
.contains(initialSelectedValue)), .contains(initialSelectedValue) &&
"Initial value is not present in the items!", items.where((e) => e.$1 == initialSelectedValue).first.$2),
"Initial value is not present in the items or is not enabled!",
), ),
super( super(
key: key, key: key,
@@ -129,38 +131,43 @@ class _AstromicRadioSelectorState<T> extends State<AstromicRadioSelector<T>> {
// //
//s1 -Widgets //s1 -Widgets
List<Widget> baseChildren = widget.items.map((currentItem) { List<Widget> baseChildren = widget.items.map((currentItem) {
bool isSelected = currentItem.value == selectedItem; bool isEnabled = currentItem.$2;
bool isSelected = currentItem.$1 == selectedItem;
// //
return !currentItem.enabled! && widget.disabledItemBuilder != null return !isEnabled && widget.disabledItemBuilder != null
? widget.configurations!.withExpandedSpace ? widget.configurations.withExpandedSpace && widget.configurations.axis == Axis.horizontal
? Expanded(child: widget.disabledItemBuilder!(currentItem)) ? Expanded(child: widget.disabledItemBuilder!(currentItem.$1))
: widget.disabledItemBuilder!(currentItem) : widget.disabledItemBuilder!(currentItem.$1)
: widget.configurations!.withExpandedSpace : widget.configurations.withExpandedSpace && widget.configurations.axis == Axis.horizontal
? Expanded(child: widget.itemBuilder(currentItem, currentItem.enabled! ? () => _onTap(currentItem.value) : null, isSelected)) ? Expanded(child: widget.itemBuilder(currentItem.$1, onTap: isEnabled ? () => _onTap(currentItem.$1) : null, isSelected: isSelected))
: widget.itemBuilder(currentItem, currentItem.enabled! ? () => _onTap(currentItem.value) : null, isSelected); : widget.itemBuilder(currentItem.$1, onTap: isEnabled ? () => _onTap(currentItem.$1) : null, isSelected: isSelected);
}).toList(); }).toList();
//s1 -Widgets //s1 -Widgets
//!SECTION //!SECTION
//SECTION - Build Return //SECTION - Build Return
return widget.configurations!.withExpandedSpace return
? widget.configurations!.axis == Axis.horizontal // widget.configurations.withExpandedSpace
// ?
widget.configurations.axis == Axis.horizontal
? separatedRow( ? separatedRow(
baseChildren, baseChildren,
AstromicSpacing.hsb(widget.itemSpacing!), AstromicSpacing.hsb(widget.itemSpacing),
) )
: separatedColumn( : separatedColumn(
baseChildren, baseChildren,
AstromicSpacing.vsb(widget.itemSpacing!), AstromicSpacing.vsb(widget.itemSpacing),
) widget.configurations.withExpandedSpace,
: Wrap(
alignment: WrapAlignment.center,
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
direction: widget.configurations!.axis,
spacing: widget.itemSpacing!,
children: baseChildren,
); );
// : Wrap(
// direction: widget.configurations.axis,
// alignment: WrapAlignment.center,
// runAlignment: WrapAlignment.center,
// crossAxisAlignment: WrapCrossAlignment.center,
// spacing: widget.itemSpacing,
// runSpacing: widget.itemSpacing,
// children: baseChildren,
// );
//!SECTION //!SECTION
} }
@@ -189,7 +196,7 @@ Widget separatedRow(List<Widget> children, Widget separator) {
); );
} }
Widget separatedColumn(List<Widget> children, Widget separator) { Widget separatedColumn(List<Widget> children, Widget separator, bool withExpandedSpace) {
List<Widget> finalChildren = []; List<Widget> finalChildren = [];
for (var e in children) { for (var e in children) {
if (children.indexOf(e) != children.length - 1) { if (children.indexOf(e) != children.length - 1) {
@@ -200,7 +207,7 @@ Widget separatedColumn(List<Widget> children, Widget separator) {
} }
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: withExpandedSpace ? CrossAxisAlignment.stretch : CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: finalChildren, children: finalChildren,
); );