Flutter范围选择滑块插件flutter_range_slider的使用

Flutter范围选择滑块插件flutter_range_slider的使用

flutter_range_slider 是一个基于 Flutter Material Slider 的扩展插件,允许用户通过两个滑块选择一个值范围。它非常适合需要用户输入范围值的场景,例如价格区间、时间范围等。

插件效果展示

使用步骤详解

完整的插件实现细节可以参考以下链接:

开始使用

1. 添加依赖

在你的 Flutter 项目中,确保添加以下依赖:

dependencies:
  flutter_range_slider: "^1.5.0"

然后运行 flutter packages upgrade 或者在 IntelliJ 中更新包。

在 Dart 文件中引入插件:

import 'package:flutter_range_slider/flutter_range_slider.dart' as frs;

重要提示
自版本 1.7 起,Flutter 框架也提供了自己的 RangeSlider 组件。如果你想继续使用此库,需要为其添加别名(如 frs),并在使用时前缀 RangeSliderRangeSliderCallback(例如 frs.RangeSliderfrs.RangeSliderCallback)。

示例代码

以下是一个完整的示例代码,展示了如何使用 flutter_range_slider 插件。

import 'package:flutter/material.dart';
import 'package:flutter_range_slider/flutter_range_slider.dart' as frs;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'RangeSlider Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: RangeSliderSample(),
    );
  }
}

class RangeSliderSample extends StatefulWidget {
  [@override](/user/override)
  _RangeSliderSampleState createState() => _RangeSliderSampleState();
}

class _RangeSliderSampleState extends State<RangeSliderSample> {
  List<RangeSliderData> rangeSliders;
  double _lowerValue = 20.0;
  double _upperValue = 80.0;
  double _lowerValueFormatter = 20.0;
  double _upperValueFormatter = 20.0;

  [@override](/user/override)
  void initState() {
    super.initState();
    rangeSliders = _rangeSliderDefinitions();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SafeArea(
      top: false,
      bottom: false,
      child: Scaffold(
        appBar: AppBar(title: Text('RangeSlider Demo')),
        body: Container(
          padding: const EdgeInsets.only(top: 50.0, left: 10.0, right: 10.0),
          child: Column(
            children: <Widget>[
              // 简单示例
              frs.RangeSlider(
                min: 0.0,
                max: 100.0,
                lowerValue: _lowerValue,
                upperValue: _upperValue,
                divisions: 5,
                showValueIndicator: true,
                valueIndicatorMaxDecimals: 1,
                onChanged: (double newLowerValue, double newUpperValue) {
                  setState(() {
                    _lowerValue = newLowerValue;
                    _upperValue = newUpperValue;
                  });
                },
                onChangeStart: (double startLowerValue, double startUpperValue) {
                  print('Started with values: $startLowerValue and $startUpperValue');
                },
                onChangeEnd: (double newLowerValue, double newUpperValue) {
                  print('Ended with values: $newLowerValue and $newUpperValue');
                },
              ),

              // 添加一些间距
              SizedBox(height: 24.0),

              // 创建一系列自定义的 RangeSliders
              ..._buildRangeSliders(),

              // 添加禁用状态的 RangeSlider
              frs.RangeSlider(
                min: 0.0,
                max: 100.0,
                lowerValue: 25.0,
                upperValue: 50.0,
                divisions: 5,
                showValueIndicator: true,
                valueIndicatorMaxDecimals: 1,
                onChanged: null,
              ),

              // 添加自定义值格式化器
              frs.RangeSlider(
                min: 0.0,
                max: 100.0,
                lowerValue: _lowerValueFormatter,
                upperValue: _upperValueFormatter,
                divisions: 10,
                showValueIndicator: true,
                valueIndicatorFormatter: (int index, double value) {
                  String twoDecimals = value.toStringAsFixed(2);
                  return '$twoDecimals mm';
                },
                onChanged: (double newLowerValue, double newUpperValue) {
                  setState(() {
                    _lowerValueFormatter = newLowerValue;
                    _upperValueFormatter = newUpperValue;
                  });
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

  // 创建一系列 RangeSliders,并根据定义进行定制
  List<Widget> _buildRangeSliders() {
    List<Widget> children = [];
    for (int index = 0; index < rangeSliders.length; index++) {
      children.add(
        rangeSliders[index].build(context, (double lower, double upper) {
          setState(() {
            rangeSliders[index].lowerValue = lower;
            rangeSliders[index].upperValue = upper;
          });
        }),
      );
      children.add(SizedBox(height: 8.0)); // 每个 RangeSlider 之间增加间距
    }
    return children;
  }

  // 定义一组 RangeSlider 参数
  List<RangeSliderData> _rangeSliderDefinitions() {
    return [
      RangeSliderData(min: 0.0, max: 100.0, lowerValue: 10.0, upperValue: 100.0),
      RangeSliderData(
        min: 0.0,
        max: 100.0,
        lowerValue: 25.0,
        upperValue: 75.0,
        divisions: 20,
        overlayColor: Colors.red[100],
      ),
      RangeSliderData(
        min: 0.0,
        max: 100.0,
        lowerValue: 10.0,
        upperValue: 30.0,
        showValueIndicator: false,
        valueIndicatorMaxDecimals: 0,
      ),
      RangeSliderData(
        min: 0.0,
        max: 100.0,
        lowerValue: 10.0,
        upperValue: 30.0,
        showValueIndicator: true,
        valueIndicatorMaxDecimals: 0,
        activeTrackColor: Colors.red,
        inactiveTrackColor: Colors.red[50],
        valueIndicatorColor: Colors.green,
      ),
      RangeSliderData(
        min: 0.0,
        max: 100.0,
        lowerValue: 25.0,
        upperValue: 75.0,
        divisions: 20,
        thumbColor: Colors.grey,
        valueIndicatorColor: Colors.grey,
      ),
    ];
  }
}

// 辅助类,用于简化 RangeSlider 的创建和参数化
class RangeSliderData {
  double min;
  double max;
  double lowerValue;
  double upperValue;
  int divisions;
  bool showValueIndicator;
  int valueIndicatorMaxDecimals;
  bool forceValueIndicator;
  Color overlayColor;
  Color activeTrackColor;
  Color inactiveTrackColor;
  Color thumbColor;
  Color valueIndicatorColor;
  Color activeTickMarkColor;

  static const Color defaultActiveTrackColor = const Color(0xFF0175c2);
  static const Color defaultInactiveTrackColor = const Color(0x3d0175c2);
  static const Color defaultActiveTickMarkColor = const Color(0x8a0175c2);
  static const Color defaultThumbColor = const Color(0xFF0175c2);
  static const Color defaultValueIndicatorColor = const Color(0xFF0175c2);
  static const Color defaultOverlayColor = const Color(0x290175c2);

  RangeSliderData({
    this.min,
    this.max,
    this.lowerValue,
    this.upperValue,
    this.divisions,
    this.showValueIndicator: true,
    this.valueIndicatorMaxDecimals: 1,
    this.forceValueIndicator: false,
    this.overlayColor: defaultOverlayColor,
    this.activeTrackColor: defaultActiveTrackColor,
    this.inactiveTrackColor: defaultInactiveTrackColor,
    this.thumbColor: defaultThumbColor,
    this.valueIndicatorColor: defaultValueIndicatorColor,
    this.activeTickMarkColor: defaultActiveTickMarkColor,
  });

  // 获取值的文本表示形式,限制到指定的小数位数
  String get lowerValueText => lowerValue.toStringAsFixed(valueIndicatorMaxDecimals);
  String get upperValueText => upperValue.toStringAsFixed(valueIndicatorMaxDecimals);

  // 构建 RangeSlider 并根据参数自定义主题
  Widget build(BuildContext context, frs.RangeSliderCallback callback) {
    return Container(
      width: double.infinity,
      child: Row(
        children: <Widget>[
          Container(
            constraints: BoxConstraints(minWidth: 40.0, maxWidth: 40.0),
            child: Text(lowerValueText),
          ),
          Expanded(
            child: SliderTheme(
              data: SliderTheme.of(context).copyWith(
                overlayColor: overlayColor,
                activeTickMarkColor: activeTickMarkColor,
                activeTrackColor: activeTrackColor,
                inactiveTrackColor: inactiveTrackColor,
                thumbColor: thumbColor,
                valueIndicatorColor: valueIndicatorColor,
                showValueIndicator: showValueIndicator
                    ? ShowValueIndicator.always
                    : ShowValueIndicator.onlyForDiscrete,
              ),
              child: frs.RangeSlider(
                min: min,
                max: max,
                lowerValue: lowerValue,
                upperValue: upperValue,
                divisions: divisions,
                showValueIndicator: showValueIndicator,
                valueIndicatorMaxDecimals: valueIndicatorMaxDecimals,
                onChanged: (double lower, double upper) {
                  callback(lower, upper);
                },
              ),
            ),
          ),
          Container(
            constraints: BoxConstraints(minWidth: 40.0, maxWidth: 40.0),
            child: Text(upperValueText),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter范围选择滑块插件flutter_range_slider的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter范围选择滑块插件flutter_range_slider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_range_slider 是一个用于在 Flutter 应用中实现范围选择滑块的插件。它允许用户通过滑动两个滑块来选择一定范围内的值。以下是如何使用 flutter_range_slider 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_range_slider 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_range_slider: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 flutter_range_slider 包:

import 'package:flutter_range_slider/flutter_range_slider.dart';

3. 使用 RangeSlider 组件

你可以在你的 Flutter 应用中使用 RangeSlider 组件来实现范围选择滑块。以下是一个简单的示例:

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

class RangeSliderExample extends StatefulWidget {
  @override
  _RangeSliderExampleState createState() => _RangeSliderExampleState();
}

class _RangeSliderExampleState extends State<RangeSliderExample> {
  double _lowerValue = 20.0;
  double _upperValue = 80.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Range Slider Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Lower Value: $_lowerValue'),
            Text('Upper Value: $_upperValue'),
            SizedBox(height: 20),
            RangeSlider(
              min: 0.0,
              max: 100.0,
              lowerValue: _lowerValue,
              upperValue: _upperValue,
              divisions: 10,
              showValueIndicator: true,
              valueIndicatorMaxDecimals: 1,
              onChanged: (double newLowerValue, double newUpperValue) {
                setState(() {
                  _lowerValue = newLowerValue;
                  _upperValue = newUpperValue;
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: RangeSliderExample(),
));

4. 参数说明

  • min: 滑块的最小值。
  • max: 滑块的最大值。
  • lowerValue: 当前选中的最小值。
  • upperValue: 当前选中的最大值。
  • divisions: 滑块的分段数,如果设置为 null,则滑块是连续的。
  • showValueIndicator: 是否显示值指示器。
  • valueIndicatorMaxDecimals: 值指示器显示的小数位数。
  • onChanged: 当滑块值发生变化时调用的回调函数。

5. 运行应用

保存文件并运行你的 Flutter 应用。你应该会看到一个范围选择滑块,用户可以通过滑动两个滑块来选择一定范围内的值。

6. 自定义样式

你可以通过 RangeSlider 的其他参数来自定义滑块的外观,例如 activeTrackColorinactiveTrackColorthumbColor 等。

RangeSlider(
  min: 0.0,
  max: 100.0,
  lowerValue: _lowerValue,
  upperValue: _upperValue,
  divisions: 10,
  showValueIndicator: true,
  valueIndicatorMaxDecimals: 1,
  activeTrackColor: Colors.blue,
  inactiveTrackColor: Colors.grey,
  thumbColor: Colors.red,
  onChanged: (double newLowerValue, double newUpperValue) {
    setState(() {
      _lowerValue = newLowerValue;
      _upperValue = newUpperValue;
    });
  },
),
回到顶部