Slider-滑块组件

2021-01-09  本文已影响0人  爱吃豆包

SliderRangeSlider

#Slider

基础用法:

class SliderDemo extends StatefulWidget {
  @override
  _SliderDemoState createState() => _SliderDemoState();
}

class _SliderDemoState extends State<SliderDemo> {
  double _sliderValue = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('值:$_sliderValue'),
            Slider(
              value: _sliderValue,
              onChanged: (v){
                setState(() {
                  _sliderValue = v;
                });
              },
            )
          ],
        ),
      ),
    );
  }
}

image

看看 Flutter 1.20 版本以前的样式(我的珍藏):

image

明显的感觉就是滑块轨道变粗了,滑块变的更有立体感(加了阴影)了。

Slider 默认滑动范围是 0-1,修改为 1-100:

Slider(
  value: _sliderValue,
  min: 1,
  max: 100,
  onChanged: (v){
    setState(() {
      _sliderValue = v;
    });
  },
)

image

设置滑块的滑动为 离散的,即滑动值为 0、25 、50、75 100:

Slider(
  value: _sliderValue,
  min: 0,
  max: 100,
  divisions: 4,
  onChanged: (v){
    setState(() {
      _sliderValue = v;
    });
  },
)

image

设置标签,滑动过程中在其上方显示:

Slider(
  value: _sliderValue,
  label: '$_sliderValue',
  min: 0,
  max: 100,
  divisions: 4,
  onChanged: (v){
    setState(() {
      _sliderValue = v;
    });
  },
)

image

看看 Flutter 1.20 版本以前的样式(依然是我的珍藏):

image

个人感觉以前的更好看。

下面是官方给的 Slider 结构图:

image

自定义滑块 激活的颜色未激活的颜色

Slider(
  activeColor: Colors.red,
  inactiveColor: Colors.blue,
  value: _sliderValue,
  label: '$_sliderValue',
  min: 0,
  max: 100,
  divisions: 4,
  onChanged: (v){
    setState(() {
      _sliderValue = v;
    });
  },
)

image

#自定义样式

这个自定义比较笼统,下面来一个更细致的自定义:

SliderTheme(
  data: SliderTheme.of(context).copyWith(
      activeTrackColor: Color(0xff404080),
      thumbColor: Colors.blue,
      overlayColor: Colors.green,
      valueIndicatorColor: Colors.purpleAccent),
  child: Slider(
    value: _sliderValue,
    label: '$_sliderValue',
    min: 0,
    max: 100,
    divisions: 4,
    onChanged: (v) {
      setState(() {
        _sliderValue = v;
      });
    },
  ),
)

image

这个基本可以完全自定义样式了。

如何在 Flutter 1.20 版本使用以前的标签样式呢?

SliderTheme(
  data: SliderTheme.of(context).copyWith(
    valueIndicatorShape: PaddleSliderValueIndicatorShape(),
  ),
  child: Slider(
    value: _sliderValue,
    label: '$_sliderValue',
    min: 0,
    max: 100,
    divisions: 4,
    onChanged: (v) {
      setState(() {
        _sliderValue = v;
      });
    },
  ),
)

image

RectangularSliderValueIndicatorShape 表示矩形样式:

image

#RangeSlider

RangeSliderSlider 几乎一样,RangeSlider 是范围滑块,想要选择一段值,可以使用 RangeSlider。

RangeValues _rangeValues = RangeValues(0, 25);

RangeSlider(
  values: _rangeValues,
  labels: RangeLabels('${_rangeValues.start}','${_rangeValues.end}'),
  min: 0,
  max: 100,
  divisions: 4,
  onChanged: (v) {
    setState(() {
      _rangeValues = v;
    });
  },
),

image

#滑块状态

image

#ios风格的 Slider

ios风格的 Slider,使用 CupertinoSlider:

double _sliderValue = 0;
CupertinoSlider(
  value: _sliderValue,
  onChanged: (v) {
    setState(() {
      _sliderValue = v;
    });
  },
)

image

当然也可以根据平台显示不同风格的Slider,ios平台显示CupertinoSlider效果,其他平台显示Material风格,用法如下:

Slider.adaptive(
  value: _sliderValue,
  onChanged: (v) {
    setState(() {
      _sliderValue = v;
    });
  },
)

代码:



import 'package:flutter/material.dart';

/**
 * Slider 滑块组件
 */
class SliderDemo extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    return SliderDemoState();
  }

}

class SliderDemoState extends State<SliderDemo> {

  var _sliderNum = 0.0;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          Slider(
             activeColor: Colors.red, // 已经激活的颜色(滑块之后的)
             inactiveColor: Colors.blue, // 未激活的颜色(滑块之前的)
            label: '$_sliderNum', // 需要设置 divisions 属性才会有显示
            divisions: 4, // 表示拖完整个进度条需要几次,这里设置4次
            value: _sliderNum, 
            onChanged: (value) {
              setState(() {
                _sliderNum = value;
              });
            }
          ),
          // 自定义样式的进度条
          Text("自定义样式进度条"),
          // 自定义滑块颜色
          SliderTheme(
            data: SliderTheme.of(context).copyWith(
              activeTrackColor: Color(0xff404080), // 激活进度条颜色(滑块左边的)
              thumbColor: Colors.blue, // 未激活进度条的颜色(滑块右边的)
              overlayColor: Colors.green, // 激活滑块,悬浮的颜色
              valueIndicatorColor: Colors.purpleAccent // 显示滑块值的颜色
            ),
            child: Slider(
              label:'$_sliderNum',
              divisions: 4,
              value: _sliderNum, 
              onChanged: (value) {
                setState(() {
                  _sliderNum = value;
                });
              }
            )
          ),
          
        ],
      ),
    );
  }

}

截屏2021-01-10 下午1.05.17.png
上一篇 下一篇

猜你喜欢

热点阅读