Flutter范围选择器插件cupertino_range_slider_improved的使用

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

Flutter范围选择器插件cupertino_range_slider_improved的使用

描述

Cupertino Range Slider 是一个Flutter插件,它提供了一个滑块组件,帮助用户从一组值中选择一个范围。这个组件的设计遵循了iOS风格的Cupertino设计语言。

截图1 截图2

使用方法

以下是一个简单的例子,演示如何使用CupertinoRangeSlider来创建一个范围选择器:

示例代码

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  double minValue = 20.0;
  double maxValue = 80.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Cupertino Range Slider Demo'),
      ),
      body: Container(
        margin: EdgeInsets.all(10.0),
        child: Column(
          children: <Widget>[
            RangeSliderItem(
              title: 'Happiness',
              initialMinValue: 20,
              initialMaxValue: 80,
              onMinValueChanged: (v) => setState(() => minValue = v.toDouble()),
              onMaxValueChanged: (v) => setState(() => maxValue = v.toDouble()),
            ),
            // 更多的RangeSliderItem可以添加在这里
          ],
        ),
      ),
    );
  }
}

class RangeSliderItem extends StatefulWidget {
  final String title;
  final int initialMinValue;
  final int initialMaxValue;
  final ValueChanged<int> onMinValueChanged;
  final ValueChanged<int> onMaxValueChanged;

  const RangeSliderItem({
    Key? key,
    required this.title,
    required this.initialMinValue,
    required this.initialMaxValue,
    required this.onMinValueChanged,
    required this.onMaxValueChanged,
  }) : super(key: key);

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

class _RangeSliderItemState extends State<RangeSliderItem> {
  late int minValue;
  late int maxValue;

  @override
  void initState() {
    super.initState();
    minValue = widget.initialMinValue;
    maxValue = widget.initialMaxValue;
  }

  @override
  Widget build(BuildContext context) {
    return FilterItemHolder(
      title: widget.title,
      value: '$minValue-$maxValue',
      child: CupertinoRangeSlider(
        minValue: minValue.roundToDouble(),
        maxValue: maxValue.roundToDouble(),
        min: 1.0,
        max: 100.0,
        onMinChanged: (minVal) {
          setState(() {
            minValue = minVal.round();
            widget.onMinValueChanged(minValue);
          });
        },
        onMaxChanged: (maxVal) {
          setState(() {
            maxValue = maxVal.round();
            widget.onMaxValueChanged(maxValue);
          });
        },
      ),
    );
  }
}

class FilterItemHolder extends StatelessWidget {
  final String title;
  final String value;
  final Widget? child;

  FilterItemHolder({Key? key, required this.title, this.value = '', this.child})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        Container(
          margin: const EdgeInsets.fromLTRB(0.0, 24.0, 0.0, 12.0),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Expanded(
                child: Text(
                  title,
                  maxLines: 1,
                  overflow: TextOverflow.clip,
                  style: TextStyle(
                    color: const Color(0xFF000000),
                    fontSize: 12.0,
                    fontWeight: FontWeight.w600,
                  ),
                ),
              ),
              Text(
                value,
                style: TextStyle(
                  color: const Color(0xFF000000),
                  fontSize: 12.0,
                  fontWeight: FontWeight.w600,
                ),
              )
            ],
          ),
        ),
        Container(
          padding: const EdgeInsets.only(left: 20.0, right: 20.0),
          decoration: BoxDecoration(
            color: Color(0xFFFFFFFF),
            borderRadius: const BorderRadius.all(const Radius.circular(5.0)),
          ),
          child: Container(
            height: 47.0,
            child: ConstrainedBox(
              constraints: BoxConstraints.expand(),
              child: child!,
            ),
          ),
        )
      ],
    );
  }
}

在这个示例中,我们创建了一个MyHomePage页面,其中包含一个RangeSliderItem,用于展示和操作范围选择器。每个RangeSliderItem都允许用户调整最小值和最大值,并实时更新界面上显示的数值范围。此外,通过设置回调函数onMinValueChangedonMaxValueChanged,可以在用户改变滑块位置时执行自定义逻辑。


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

1 回复

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


当然,以下是如何在Flutter中使用cupertino_range_slider_improved插件的一个基本示例。这个插件允许你在Flutter应用中实现一个iOS风格的范围选择器。

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

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

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

接下来,你可以在你的Flutter应用中实现这个范围选择器。以下是一个完整的示例代码,展示了如何使用cupertino_range_slider_improved

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

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

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

class RangeSliderScreen extends StatefulWidget {
  @override
  _RangeSliderScreenState createState() => _RangeSliderScreenState();
}

class _RangeSliderScreenState extends State<RangeSliderScreen> {
  double _lowerValue = 20.0;
  double _upperValue = 50.0;

  void _onValuesChanged(double lowerValue, double upperValue) {
    setState(() {
      _lowerValue = lowerValue;
      _upperValue = upperValue;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Range Slider Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            Text('Lower Value: $_lowerValue'),
            SizedBox(height: 16.0),
            Text('Upper Value: $_upperValue'),
            SizedBox(height: 32.0),
            CupertinoRangeSliderImproved(
              min: 0.0,
              max: 100.0,
              lowerValue: _lowerValue,
              upperValue: _upperValue,
              onValuesChanged: _onValuesChanged,
              divisions: 100,
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 添加依赖:在pubspec.yaml文件中添加了cupertino_range_slider_improved依赖。
  2. 创建应用:定义了一个基本的Flutter应用,包含一个主屏幕RangeSliderScreen
  3. 状态管理:使用StatefulWidget来管理范围选择器的值。
  4. UI构建:在RangeSliderScreenbuild方法中,构建了一个包含文本和范围选择器的列。
  5. 范围选择器:使用CupertinoRangeSliderImproved来创建范围选择器,并设置了最小值、最大值、当前的下限值和上限值,以及值变化时的回调函数。

运行这个应用,你会看到一个简单的界面,上面显示了当前的下限值和上限值,以及一个可以拖动来调整这些值的范围选择器。

回到顶部