Skip to content

Commit fcca8c0

Browse files
CupertinoSlider control and Slider.adaptive (#2224)
* cupertino slider * Slider.adaptive --------- Co-authored-by: Feodor Fitsner <[email protected]>
1 parent 191478f commit fcca8c0

File tree

6 files changed

+386
-2
lines changed

6 files changed

+386
-2
lines changed

package/lib/src/controls/create_control.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import 'animated_switcher.dart';
1818
import 'bottom_app_bar.dart';
1919
import 'audio.dart';
2020
import 'badge.dart';
21+
import 'cupertino_slider.dart';
2122
import 'expansion_panel.dart';
2223
import 'selection_area.dart';
2324
import 'banner.dart';
@@ -518,6 +519,14 @@ Widget createWidget(Key? key, ControlViewModel controlView, Control? parent,
518519
parentDisabled: parentDisabled,
519520
dispatch: controlView.dispatch,
520521
);
522+
case "cupertinoslider":
523+
return CupertinoSliderControl(
524+
key: key,
525+
parent: parent,
526+
control: controlView.control,
527+
parentDisabled: parentDisabled,
528+
dispatch: controlView.dispatch,
529+
);
521530
case "rangeslider":
522531
return RangeSliderControl(
523532
key: key,
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import 'package:flutter/cupertino.dart';
2+
import 'package:flutter/material.dart';
3+
import '../actions.dart';
4+
import '../flet_app_services.dart';
5+
import '../models/control.dart';
6+
import '../protocol/update_control_props_payload.dart';
7+
import '../utils/colors.dart';
8+
import '../utils/desktop.dart';
9+
import '../utils/debouncer.dart';
10+
import 'create_control.dart';
11+
12+
class CupertinoSliderControl extends StatefulWidget {
13+
final Control? parent;
14+
final Control control;
15+
final bool parentDisabled;
16+
final dynamic dispatch;
17+
18+
const CupertinoSliderControl(
19+
{Key? key,
20+
this.parent,
21+
required this.control,
22+
required this.parentDisabled,
23+
required this.dispatch})
24+
: super(key: key);
25+
26+
@override
27+
State<CupertinoSliderControl> createState() => _CupertinoSliderControlState();
28+
}
29+
30+
class _CupertinoSliderControlState extends State<CupertinoSliderControl> {
31+
double _value = 0;
32+
final _debouncer = Debouncer(milliseconds: isDesktop() ? 10 : 100);
33+
34+
@override
35+
void dispose() {
36+
_debouncer.dispose();
37+
super.dispose();
38+
}
39+
40+
void onChange(double value) {
41+
var svalue = value.toString();
42+
debugPrint(svalue);
43+
setState(() {
44+
_value = value;
45+
});
46+
47+
List<Map<String, String>> props = [
48+
{"i": widget.control.id, "value": svalue}
49+
];
50+
widget.dispatch(
51+
UpdateControlPropsAction(UpdateControlPropsPayload(props: props)));
52+
53+
_debouncer.run(() {
54+
final server = FletAppServices.of(context).server;
55+
server.updateControlProps(props: props);
56+
server.sendPageEvent(
57+
eventTarget: widget.control.id, eventName: "change", eventData: '');
58+
});
59+
}
60+
61+
@override
62+
Widget build(BuildContext context) {
63+
debugPrint("CupertinoSliderControl build: ${widget.control.id}");
64+
65+
bool disabled = widget.control.isDisabled || widget.parentDisabled;
66+
67+
double min = widget.control.attrDouble("min", 0)!;
68+
double max = widget.control.attrDouble("max", 1)!;
69+
int? divisions = widget.control.attrInt("divisions");
70+
71+
final server = FletAppServices.of(context).server;
72+
73+
debugPrint(
74+
"CupertinoSliderControl StoreConnector build: ${widget.control.id}");
75+
76+
double value = widget.control.attrDouble("value", 0)!;
77+
if (_value != value) {
78+
// verify limits
79+
if (value < min) {
80+
_value = min;
81+
} else if (value > max) {
82+
_value = max;
83+
} else {
84+
_value = value;
85+
}
86+
}
87+
88+
var cupertinoSlider = CupertinoSlider(
89+
value: _value,
90+
min: min,
91+
max: max,
92+
divisions: divisions,
93+
activeColor: HexColor.fromString(
94+
Theme.of(context), widget.control.attrString("activeColor", "")!),
95+
thumbColor: HexColor.fromString(Theme.of(context),
96+
widget.control.attrString("thumbColor", "")!) ??
97+
CupertinoColors.white,
98+
onChanged: !disabled
99+
? (double value) {
100+
onChange(value);
101+
}
102+
: null,
103+
onChangeStart: !disabled
104+
? (double value) {
105+
server.sendPageEvent(
106+
eventTarget: widget.control.id,
107+
eventName: "change_start",
108+
eventData: value.toString());
109+
}
110+
: null,
111+
onChangeEnd: !disabled
112+
? (double value) {
113+
server.sendPageEvent(
114+
eventTarget: widget.control.id,
115+
eventName: "change_end",
116+
eventData: value.toString());
117+
}
118+
: null);
119+
120+
return constrainedControl(
121+
context, cupertinoSlider, widget.parent, widget.control);
122+
}
123+
}

package/lib/src/controls/slider.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter/foundation.dart';
12
import 'package:flutter/material.dart';
23
import '../actions.dart';
34
import '../flet_app_services.dart';
@@ -7,6 +8,7 @@ import '../utils/colors.dart';
78
import '../utils/desktop.dart';
89
import '../utils/debouncer.dart';
910
import 'create_control.dart';
11+
import 'cupertino_slider.dart';
1012

1113
class SliderControl extends StatefulWidget {
1214
final Control? parent;
@@ -78,6 +80,16 @@ class _SliderControlState extends State<SliderControl> {
7880
Widget build(BuildContext context) {
7981
debugPrint("SliderControl build: ${widget.control.id}");
8082

83+
bool adaptive = widget.control.attrBool("adaptive", false)!;
84+
if (adaptive &&
85+
(defaultTargetPlatform == TargetPlatform.iOS ||
86+
defaultTargetPlatform == TargetPlatform.macOS)) {
87+
return CupertinoSliderControl(
88+
control: widget.control,
89+
parentDisabled: widget.parentDisabled,
90+
dispatch: widget.dispatch);
91+
}
92+
8193
String? label = widget.control.attrString("label");
8294
bool autofocus = widget.control.attrBool("autofocus", false)!;
8395
bool disabled = widget.control.isDisabled || widget.parentDisabled;

sdk/python/packages/flet-core/src/flet_core/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,4 +229,5 @@
229229
from flet_core.selection_area import SelectionArea
230230
from flet_core.cupertino_radio import CupertinoRadio
231231
from flet_core.cupertino_checkbox import CupertinoCheckbox
232+
from flet_core.cupertino_slider import CupertinoSlider
232233
from flet_core.cupertino_switch import CupertinoSwitch

0 commit comments

Comments
 (0)