用Flutter实现OpenHarmony滑块输入
本文介绍了Flutter中Slider和RangeSlider组件的使用方法和高级应用。主要内容包括:1) 单值滑块和范围滑块的基本实现;2) 滑块的核心参数配置;3) 滑块样式定制;4) 高级功能如验证、实时反馈、离散值处理等;5) 企业级应用场景如键盘控制、无障碍支持和动画效果。通过代码示例展示了如何实现响应式设计、表单集成和自定义外观等功能,帮助开发者构建完善的滑块输入系统。
·
案例概述
本案例展示如何使用 Slider 和 RangeSlider 实现滑块输入功能,包括单值滑块和范围滑块。
核心概念
1. Slider
- 单值滑块;
- 用于选择一个数值;
- 支持
min、max、divisions等参数。
2. RangeSlider
- 范围滑块;
- 用于选择一个数值范围;
- 返回
RangeValues。
3. 滑块参数
value:当前值;min、max:最小/最大值;divisions:分段数(用于离散值);label:显示的标签。
代码详解
1. 单值滑块
Slider(
value: _volume,
min: 0,
max: 100,
divisions: 10,
label: _volume.round().toString(),
onChanged: (double value) {
setState(() {
_volume = value;
});
},
)
2. 范围滑块
RangeSlider(
values: _priceRange,
min: 0,
max: 1000,
divisions: 20,
labels: RangeLabels(
_priceRange.start.toStringAsFixed(0),
_priceRange.end.toStringAsFixed(0),
),
onChanged: (RangeValues values) {
setState(() {
_priceRange = values;
});
},
)
3. 滑块样式
Slider(
value: _brightness,
activeColor: Colors.orange,
inactiveColor: Colors.grey.shade300,
onChanged: (value) => setState(() => _brightness = value),
)
高级话题:滑块的高级应用
1. 滑块验证
validator: (value) {
if (_volume < 10) return '音量不能低于 10';
if (_volume > 90) return '音量不能高于 90';
return null;
}
2. 滑块的实时反馈
Column(
children: [
Slider(
value: _brightness,
onChanged: (value) => setState(() => _brightness = value),
),
Container(
height: 100,
color: Colors.grey.withOpacity(_brightness / 100),
child: Center(
child: Text('亮度:${_brightness.toStringAsFixed(0)}%'),
),
),
],
)
3. 滑块的离散值
Slider(
value: _selectedSize.toDouble(),
min: 0,
max: sizes.length - 1,
divisions: sizes.length - 1,
label: sizes[_selectedSize.toInt()],
onChanged: (value) => setState(() => _selectedSize = value.toInt()),
)
4. 滑块的响应式设计
SizedBox(
width: MediaQuery.of(context).size.width < 600 ? 200 : 400,
child: Slider(
value: _value,
onChanged: (value) => setState(() => _value = value),
),
)
5. 滑块的键盘控制
Focus(
onKey: (node, event) {
if (event.isKeyPressed(LogicalKeyboardKey.arrowRight)) {
setState(() => _value = (_value + 1).clamp(0, 100));
return KeyEventResult.handled;
}
if (event.isKeyPressed(LogicalKeyboardKey.arrowLeft)) {
setState(() => _value = (_value - 1).clamp(0, 100));
return KeyEventResult.handled;
}
return KeyEventResult.ignored;
},
child: Slider(value: _value, onChanged: ...),
)
6. 滑块的无障碍支持
Slider(
value: _value,
semanticFormatterCallback: (value) => '${value.toStringAsFixed(0)}%',
onChanged: (value) => setState(() => _value = value),
)
7. 滑块的自定义外观
SliderTheme(
data: SliderThemeData(
trackHeight: 8,
thumbShape: RoundSliderThumbShape(enabledThumbRadius: 12),
overlayShape: RoundSliderOverlayShape(overlayRadius: 20),
),
child: Slider(
value: _value,
onChanged: (value) => setState(() => _value = value),
),
)
8. 范围滑块的应用
// 价格范围筛选
RangeSlider(
values: _priceRange,
min: 0,
max: 10000,
onChanged: (RangeValues values) {
setState(() {
_priceRange = values;
_filterProducts();
});
},
)
9. 滑块的动画效果
AnimatedBuilder(
animation: _sliderAnimation,
builder: (context, child) {
return Slider(
value: _sliderAnimation.value,
onChanged: (value) => setState(() => _value = value),
);
},
)
10. 滑块与表单集成
FormField<double>(
initialValue: _value,
validator: (value) {
if (value == null || value < 10) return '值不能小于 10';
return null;
},
builder: (FormFieldState<double> state) {
return Slider(
value: state.value ?? 50,
onChanged: (value) {
state.didChange(value);
setState(() => _value = value);
},
);
},
)
通过这些高级技巧,你可以构建出功能完整的滑块输入系统。
高级话题:滑块的企业级应用
1. 滑块的实时反馈
Column(
children: [
Slider(value: _brightness, onChanged: (value) => setState(() => _brightness = value)),
Container(
height: 100,
color: Colors.grey.withOpacity(_brightness / 100),
child: Center(child: Text('亮度:${_brightness.toStringAsFixed(0)}%')),
),
],
)
2. 滑块的离散值
Slider(
value: _selectedSize.toDouble(),
min: 0,
max: sizes.length - 1,
divisions: sizes.length - 1,
label: sizes[_selectedSize.toInt()],
onChanged: (value) => setState(() => _selectedSize = value.toInt()),
)
3. 滑块的键盘控制
Focus(
onKey: (node, event) {
if (event.isKeyPressed(LogicalKeyboardKey.arrowRight)) {
setState(() => _value = (_value + 1).clamp(0, 100));
return KeyEventResult.handled;
}
return KeyEventResult.ignored;
},
child: Slider(value: _value, onChanged: ...),
)
4. 滑块的自定义外观
SliderTheme(
data: SliderThemeData(
trackHeight: 8,
thumbShape: RoundSliderThumbShape(enabledThumbRadius: 12),
overlayShape: RoundSliderOverlayShape(overlayRadius: 20),
),
child: Slider(value: _value, onChanged: (value) => setState(() => _value = value)),
)
5. 范围滑块的应用
RangeSlider(
values: _priceRange,
min: 0,
max: 10000,
onChanged: (RangeValues values) {
setState(() {
_priceRange = values;
_filterProducts();
});
},
)
6. 滑块的响应式设计
SizedBox(
width: MediaQuery.of(context).size.width < 600 ? 200 : 400,
child: Slider(value: _value, onChanged: (value) => setState(() => _value = value)),
)
7. 滑块的无障碍支持
Slider(
value: _value,
semanticFormatterCallback: (value) => '${value.toStringAsFixed(0)}%',
onChanged: (value) => setState(() => _value = value),
)
8. 滑块的动画效果
AnimatedBuilder(
animation: _sliderAnimation,
builder: (context, child) {
return Slider(
value: _sliderAnimation.value,
onChanged: (value) => setState(() => _value = value),
);
},
)
9. 滑块与表单集成
FormField<double>(
initialValue: _value,
validator: (value) {
if (value == null || value < 10) return '值不能小于 10';
return null;
},
builder: (FormFieldState<double> state) {
return Slider(
value: state.value ?? 50,
onChanged: (value) {
state.didChange(value);
setState(() => _value = value);
},
);
},
)
10. 滑块的验证
validator: (value) {
if (_volume < 10) return '音量不能低于 10';
if (_volume > 90) return '音量不能高于 90';
return null;
}
通过这些企业级技巧,你可以构建出功能完整的滑块系统。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐



所有评论(0)