Form
Slider
A sliding input component that allows users to select a value within a specified range by dragging a handle or tapping on the track.
CLI
To generate and customize this style:
dart run forui style create sliderUsage
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.6)),
);FSlider(...)
FSlider(
control: FSliderControl.managedContinuous(
initial: FSliderValue(max: 0.75, constraints: (min: 0, max: 0.8)),
interaction: FSliderInteraction.tap,
onChange: (value) {},
),
style: (style) => style.copyWith(...),
layout: FLayout.rtl,
tooltipBuilder: (style, value) => Text('${value.toStringAsFixed(2)}%'),
marks: const [
FSliderMark(value: 0, label: Text('0%')),
FSliderMark(value: 0.5, label: Text('50%')),
FSliderMark(value: 1, label: Text('100%')),
],
onEnd: (value) {},
);Examples
Appearance
Labelled
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.6)),
label: const Text('Volume'),
description: const Text('Adjust the volume by dragging the slider.'),
);Disabled
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.6)),
label: const Text('Volume'),
description: const Text('Adjust the volume by dragging the slider.'),
enabled: false,
);Error
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.6)),
label: const Text('Volume'),
description: const Text('Adjust the volume by dragging the slider.'),
forceErrorText: 'Volume is too high.',
);Tooltip
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.6)),
tooltipBuilder: (style, value) {
final hex = (value * 100).round().toRadixString(16).padLeft(2, '0');
return Text('0x$hex');
},
);Marks
Marks provide visual reference points on the slider track. Each mark consists of:
- A tick: A visual indicator showing the mark's position
- A label: Text describing the mark's value (optional)
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.35)),
marks: const [
FSliderMark(value: 0, label: Text('0%')),
FSliderMark(value: 0.25, tick: false),
FSliderMark(value: 0.5),
FSliderMark(value: 0.75, tick: false),
FSliderMark(value: 1, label: Text('100%')),
],
);Layouts and Selections
Discrete Values
FSlider(
control: FSliderControl.managedDiscrete(initial: FSliderValue(max: 0.25)),
marks: const [
FSliderMark(value: 0, label: Text('0%')),
FSliderMark(value: 0.25, tick: false),
FSliderMark(value: 0.5),
FSliderMark(value: 0.75, tick: false),
FSliderMark(value: 1, label: Text('100%')),
],
);Range Selection
FSlider(
control: FSliderControl.managedContinuousRange(initial: FSliderValue(min: 0.25, max: 0.75)),
);Selection Boundaries
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.6, constraints: (min: 0.25, max: 0.75))),
);Vertical Orientation
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.35)),
label: const Text('Volume'),
description: const Text('Adjust the volume by dragging the slider.'),
layout: FLayout.btt,
trackMainAxisExtent: 350,
marks: const [
FSliderMark(value: 0, label: Text('0%')),
FSliderMark(value: 0.25, tick: false),
FSliderMark(value: 0.5, label: Text('50%')),
FSliderMark(value: 0.75, tick: false),
FSliderMark(value: 1, label: Text('100%')),
],
);Interactions
Slide Track
Slide anywhere on the track or thumb to select a value.
FSlider(
control: FSliderControl.managedContinuous(
initial: FSliderValue(max: 0.6),
interaction: FSliderInteraction.slide,
),
);Slide Thumb
Slide the thumb to select a value.
FSlider(
control: FSliderControl.managedContinuous(
initial: FSliderValue(max: 0.6),
interaction: FSliderInteraction.slideThumb,
),
);Tap
Tap anywhere on the track to select a value.
FSlider(
control: FSliderControl.managedContinuous(
initial: FSliderValue(max: 0.6),
interaction: FSliderInteraction.tap,
),
);Tap and Slide Thumb
Tap anywhere or slide the thumb to select a value.
FSlider(
control: FSliderControl.managedContinuous(
initial: FSliderValue(max: 0.6),
interaction: FSliderInteraction.tapAndSlideThumb,
),
);Form
class SliderForm extends StatefulWidget {
@override
State<SliderForm> createState() => _SliderFormState();
}
class _SliderFormState extends State<SliderForm> {
final _key = GlobalKey<FormState>();
@override
Widget build(BuildContext context) => Form(
key: _key,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
FSlider(
control: FSliderControl.managedContinuous(initial: FSliderValue(max: 0.35)),
label: const Text('Brightness'),
description: const Text('Adjust the brightness level.'),
marks: const [
FSliderMark(value: 0, label: Text('0%')),
FSliderMark(value: 0.25, tick: false),
FSliderMark(value: 0.5, label: Text('50%')),
FSliderMark(value: 0.75, tick: false),
FSliderMark(value: 1, label: Text('100%')),
],
),
const SizedBox(height: 20),
FButton(
child: const Text('Save'),
onPress: () {
if (!_key.currentState!.validate()) {
// Handle errors here.
return;
}
_key.currentState!.save();
// Do something.
},
),
],
),
);
}