Skip to content

Commit

Permalink
Added ControlledToggle
Browse files Browse the repository at this point in the history
  • Loading branch information
sunarya-thito committed Feb 24, 2025
1 parent 7aa6c96 commit fc73442
Showing 1 changed file with 70 additions and 6 deletions.
76 changes: 70 additions & 6 deletions lib/src/components/control/button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,71 @@ import 'dart:math';

import '../../../shadcn_flutter.dart';

class ToggleController extends ValueNotifier<bool>
with ComponentController<bool> {
ToggleController([super.value = false]);

void toggle() {
value = !value;
}
}

class ControlledToggle extends StatelessWidget with ControlledComponent<bool> {
@override
final bool? initialValue;
@override
final ValueChanged<bool>? onChanged;
@override
final bool enabled;
@override
final ToggleController? controller;

final Widget child;
final ButtonStyle style;

const ControlledToggle({
super.key,
this.controller,
this.initialValue,
this.onChanged,
this.enabled = true,
required this.child,
this.style = const ButtonStyle.ghost(),
});

@override
Widget build(BuildContext context) {
return ControlledComponentBuilder(
controller: controller,
initialValue: initialValue,
onChanged: onChanged,
enabled: enabled,
builder: (context, data) {
return Toggle(
value: data.value,
onChanged: data.onChanged,
enabled: data.enabled,
style: style,
child: child,
);
},
);
}
}

class Toggle extends StatefulWidget {
final bool value;
final ValueChanged<bool>? onChanged;
final Widget child;
final ButtonStyle style;
final bool? enabled;

const Toggle({
super.key,
required this.value,
this.onChanged,
required this.child,
this.enabled,
this.style = const ButtonStyle.ghost(),
});

Expand All @@ -21,27 +75,37 @@ class Toggle extends StatefulWidget {
}

// toggle button is just ghost button
class ToggleState extends State<Toggle> {
class ToggleState extends State<Toggle> with FormValueSupplier<bool, Toggle> {
final WidgetStatesController statesController = WidgetStatesController();

@override
void initState() {
super.initState();
statesController.update(WidgetState.selected, widget.value);
formValue = widget.value;
}

@override
void didUpdateWidget(Toggle oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.value != widget.value) {
statesController.update(WidgetState.selected, widget.value);
formValue = widget.value;
}
}

@override
void didReplaceFormValue(bool value) {
if (widget.onChanged != null) {
widget.onChanged!(value);
}
}

@override
Widget build(BuildContext context) {
return Button(
statesController: statesController,
enabled: widget.enabled,
style: widget.value
? ButtonStyle.secondary(
density: widget.style.density,
Expand All @@ -63,11 +127,11 @@ class ToggleState extends State<Toggle> {
: null,
);
}),
onPressed: () {
if (widget.onChanged != null) {
widget.onChanged!(!widget.value);
}
},
onPressed: widget.onChanged != null
? () {
widget.onChanged!(!widget.value);
}
: null,
child: widget.child);
}
}
Expand Down

0 comments on commit fc73442

Please sign in to comment.