Flutter滑动条控制插件filling_slider的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter滑动条控制插件filling_slider的使用

Filling Slider

pub.dev points pub.dev likes pub.dev popularity

这是一个类似iOS风格的滑动条小部件。

你可以在这里查看 Demo

Example gif

如何使用

简单垂直滑动条

FillingSlider()

简单水平滑动条

FillingSlider(
  direction: FillingSliderDirection.horizontal
)

属性

你可以设置滑动条的初始值,范围在 [0.0, 1.0] 之间。

double initialValue

视觉属性

你可以更改滑动条的大小、方向和颜色。

double width
double height
Color color
Color fillColor
SliderDirection direction

回调属性

有两种方法可以响应滑动条值的变化。

Function onChange - 通知所有滑动条变化
Function onFinish - 通知变化结束

子组件属性

Widget child
Function childBuilder

示例代码

以下是一个完整的示例demo,展示了如何使用 filling_slider 插件创建垂直和水平滑动条,并结合动画效果。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:filling_slider/filling_slider.dart';
import 'package:rive/rive.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Filling Slider Demo',
      home: MyHomePage(title: 'Filling Slider Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  Artboard? _riveArtboard;

  @override
  void initState() {
    rootBundle.load('assets/volume.riv').then(
      (data) {
        final file = RiveFile.import(data);
        setState(() => _riveArtboard = file.mainArtboard);
      },
    );
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Vertical slider with Rive\'s animation'),
            Padding(padding: EdgeInsets.only(bottom: 20)),
            FillingSlider(
                initialValue: 0.9,
                onChange: onChangeWithRive,
                child: SizedBox(
                  height: 60,
                  width: 60,
                  child: _riveArtboard == null
                      ? Container()
                      : Rive(artboard: _riveArtboard!, fit: BoxFit.cover),
                )),
            Padding(padding: EdgeInsets.only(bottom: 40)),
            Text('Horizontal slider with icons and AnimationSwitcher'),
            Padding(padding: EdgeInsets.only(bottom: 20)),
            FillingSlider(
                initialValue: 0.9,
                width: 150,
                height: 40,
                direction: FillingSliderDirection.horizontal,
                childBuilder: (ctx, value) => AnimatedSwitcher(
                      layoutBuilder: (Widget? currentChild, List<Widget> previousChildren) {
                        return currentChild!;
                      },
                      duration: Duration(seconds: 1),
                      child: getIcon(value),
                    )),
          ],
        ),
      ),
    );
  }

  void onChangeWithRive(double newVal, double old) {
    List triggers = [1.0, 0.7, 0.3, 0.0];
    var start = 3;
    var end = 1;
    for (var i = 0; i < triggers.length - 1; i++) {
      if (newVal == 0) {
        end = 0;
      } else if (newVal <= triggers[i] && newVal >= triggers[i + 1]) {
        end = 3 - i;
      }
      if (old == 0) {
        start = 0;
      } else if (old <= triggers[i] && old >= triggers[i + 1]) {
        start = 3 - i;
      }
    }
    _riveArtboard!.addController(SimpleAnimation('$start-$end'));
  }

  Widget getIcon(double newVal) {
    return newVal > 0.5
        ? Icon(Icons.brightness_2_outlined, size: 20, key: ValueKey(1))
        : Icon(Icons.brightness_1_outlined, size: 20, key: ValueKey(2));
  }
}

这个示例展示了如何创建一个带有Rive动画的垂直滑动条和一个带有图标和动画切换器的水平滑动条。你可以根据需要调整代码中的属性和回调函数,以适应你的具体需求。


更多关于Flutter滑动条控制插件filling_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter滑动条控制插件filling_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,filling_slider 是一个 Flutter 插件,用于创建填充式滑动条(Filling Slider),这种滑动条在用户拖动滑块时可以显示填充效果。这对于需要用户选择范围或进度的情况非常有用。

以下是一个使用 filling_slider 插件的示例代码:

首先,确保在你的 pubspec.yaml 文件中添加 filling_slider 依赖:

dependencies:
  flutter:
    sdk: flutter
  filling_slider: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来安装依赖。

接下来,在你的 Dart 文件中使用 FillingSlider 组件。以下是一个完整的示例,展示如何在一个简单的 Flutter 应用中使用 filling_slider

import 'package:flutter/material.dart';
import 'package:filling_slider/filling_slider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Filling Slider Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  double _value = 0.5;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Filling Slider Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Value: $_value',
              style: Theme.of(context).textTheme.headline4,
            ),
            SizedBox(height: 20),
            FillingSlider(
              value: _value,
              onChanged: (newValue) {
                setState(() {
                  _value = newValue;
                });
              },
              width: 300,
              height: 50,
              rangeSlider: false,
              min: 0,
              max: 1,
              fillingColor: Colors.blue,
              handlerColor: Colors.white,
              backgroundColor: Colors.grey[300]!,
              borderRadius: BorderRadius.circular(25),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 依赖添加:在 pubspec.yaml 中添加 filling_slider 依赖。
  2. 导入包:在 Dart 文件中导入 filling_slider 包。
  3. 构建应用
    • 创建一个 MyApp 无状态组件,作为应用的根组件。
    • 创建一个 MyHomePage 有状态组件,作为应用的主页。
    • _MyHomePageState 中定义一个 _value 变量,用于存储滑动条的值。
    • 使用 CenterColumn 组件来布局界面。
    • 使用 Text 组件显示当前滑动条的值。
    • 使用 FillingSlider 组件创建填充式滑动条,并配置相关属性:
      • value:滑动条当前的值。
      • onChanged:当滑动条值改变时的回调函数。
      • widthheight:滑动条的宽度和高度。
      • rangeSlider:是否为范围滑动条(这里设置为 false)。
      • minmax:滑动条的最小值和最大值。
      • fillingColor:填充颜色。
      • handlerColor:滑块颜色。
      • backgroundColor:背景颜色。
      • borderRadius:圆角半径。

通过这些代码,你就可以在 Flutter 应用中使用 filling_slider 插件来创建一个具有填充效果的滑动条。

回到顶部