字
字节笔记本
2026年2月22日
Flutter Slider 滑动条组件详解
本文详细介绍 Flutter 中 Slider、RangeSlider 和 CupertinoSlider 三种滑动条组件的使用方法,包括基础用法、参数配置、样式自定义等,帮助开发者快速掌握这些常用的 UI 控件。
Slider(滑动条)
Slider 可以快速的从一系列值中做出选择,常用于音量调节、亮度设置、进度控制等场景。
基础用法
Slider 需要设置 value 和 onChanged 两个必传参数:
dart
double _sliderValue = 0;
Slider(
value: _sliderValue,
onChanged: (v) {
setState(() {
_sliderValue = v;
});
},
)注意:如果不设置 onChanged 属性,Slider 控件将处于禁用状态,无法滑动。Slider 本身没有内置的滑动动画效果,需要通过 onChanged 回调动态改变 value 的值来实现交互。
常用属性
| 属性 | 类型 | 说明 |
|---|---|---|
value | double | 当前值(必传) |
onChanged | ValueChanged | 值变化回调(必传) |
min | double | 最小值,默认 0 |
max | double | 最大值,默认 1 |
divisions | int | 分割段数,用于离散值选择 |
label | String | 滑动时显示的标签 |
activeColor | Color | 已激活部分的颜色 |
inactiveColor | Color | 未激活部分的颜色 |
onChangeStart | ValueChanged | 开始滑动时的回调 |
onChangeEnd | ValueChanged | 结束滑动时的回调 |
完整示例
dart
class SliderDemo extends StatefulWidget {
@override
_SliderDemoState createState() => _SliderDemoState();
}
class _SliderDemoState extends State<SliderDemo> {
double _value = 20.0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Slider 示例')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('当前值:${_value.toStringAsFixed(1)}'),
Slider(
value: _value,
min: 20.0,
max: 330.0,
divisions: 5,
label: '${_value.toStringAsFixed(1)} 元',
activeColor: Colors.blue,
inactiveColor: Colors.grey[300],
onChanged: (newValue) {
setState(() {
_value = newValue;
});
},
onChangeStart: (startValue) {
print('开始滑动: $startValue');
},
onChangeEnd: (endValue) {
print('结束滑动: $endValue');
},
),
],
),
),
);
}
}使用 SliderTheme 自定义样式
通过 SliderTheme 可以实现更精细的样式控制:
dart
SliderTheme(
data: SliderTheme.of(context).copyWith(
activeTrackColor: Color(0xff404080),
inactiveTrackColor: Colors.grey[300],
thumbColor: Colors.blue,
overlayColor: Colors.green.withOpacity(0.3),
valueIndicatorColor: Colors.purpleAccent,
showValueIndicator: ShowValueIndicator.always,
),
child: Slider(
value: _sliderValue,
min: 0,
max: 100,
divisions: 4,
label: '$_sliderValue',
onChanged: (v) {
setState(() {
_sliderValue = v;
});
},
),
)RangeSlider(区间滑动条)
RangeSlider 用于选择一个数值范围,适用于价格区间、时间范围等场景。
基础用法
dart
RangeValues _rangeValues = RangeValues(40, 80);
RangeSlider(
values: _rangeValues,
min: 0,
max: 100,
divisions: 10,
labels: RangeLabels(
'开始:${_rangeValues.start.toStringAsFixed(0)}',
'结束:${_rangeValues.end.toStringAsFixed(0)}',
),
onChanged: (value) {
setState(() {
_rangeValues = value;
});
},
)自定义样式
dart
RangeSlider(
values: _rangeValues,
min: 0,
max: 100,
divisions: 10,
activeColor: Colors.orange,
inactiveColor: Colors.grey,
labels: RangeLabels(
'${_rangeValues.start.toStringAsFixed(0)}%',
'${_rangeValues.end.toStringAsFixed(0)}%',
),
onChanged: (value) {
setState(() {
_rangeValues = value;
}),
},
)CupertinoSlider(iOS 风格滑动条)
CupertinoSlider 提供了 iOS 风格的滑动条外观,适合需要与 iOS 设计风格保持一致的场景。
基础用法
dart
CupertinoSlider(
value: _sliderValue,
min: 0,
max: 100,
divisions: 5,
activeColor: Colors.purple,
thumbColor: Colors.cyan,
onChanged: (value) {
setState(() {
_sliderValue = value;
});
},
)自适应平台样式
Flutter 还提供了自适应的 Slider,会根据平台自动选择 Material 或 Cupertino 样式:
dart
Slider.adaptive(
value: _sliderValue,
onChanged: (v) {
setState(() {
_sliderValue = v;
});
},
)版本更新说明
Flutter 1.20 版本对 Slider 进行了视觉更新:
- 轨道(track)变得更粗
- 滑块(thumb)采用 3D 风格并带有阴影效果
- 整体视觉效果更加现代
总结
| 组件 | 适用场景 | 特点 |
|---|---|---|
| Slider | 单值选择 | Material 设计,高度可定制 |
| RangeSlider | 范围选择 | 双滑块,适合区间设置 |
| CupertinoSlider | iOS 风格应用 | 与 iOS 设计一致 |
选择合适的滑动条组件,可以为用户提供直观、流畅的数值输入体验。
分享: