在这里插入图片描述

案例概述

本案例展示如何使用 SliderRangeSlider 实现滑块输入功能,包括单值滑块和范围滑块。

核心概念

1. Slider

  • 单值滑块;
  • 用于选择一个数值;
  • 支持 minmaxdivisions 等参数。

2. RangeSlider

  • 范围滑块;
  • 用于选择一个数值范围;
  • 返回 RangeValues

3. 滑块参数

  • value:当前值;
  • minmax:最小/最大值;
  • 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

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐