Flutter重叠滑块插件overlapped_slider的使用

Flutter重叠滑块插件overlapped_slider的使用

Overlapped Slider

一个水平方向的重叠滑块小部件。中间的小部件会位于堆栈的顶部。

Demo

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  overlapped_slider: ^1.0.0

然后导入包:

import 'package:overlapped_slider/overlapped_slider.dart';

如何使用

只需添加一个 OverlappedSlider 小部件,并传入必要的参数。

以下是一个完整的示例代码:

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:overlapped_slider/overlapped_slider.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Overlapped Slider',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Overlapped Slider'),
    );
  }
}

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

  final String? title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 生成一个包含多个小部件的列表。您可以使用其他方法
  List<Widget> widgets1 = List.generate(
    5,
    (index) => ClipRRect(
      borderRadius: const BorderRadius.all(
        Radius.circular(5.0),
      ),
      child: Image.asset(
        'assets/images/$index.jpg', // 图片存储在 assets 文件夹中
        fit: BoxFit.fill,
      ),
    ),
  );
  List<Widget> widgets2 = List.generate(
    5,
    (index) => Container(
      height: 60,
      clipBehavior: Clip.hardEdge,
      decoration: BoxDecoration(
          shape: BoxShape.circle,
          color: Colors.white,
          image: DecorationImage(
              fit: BoxFit.contain,
              image: AssetImage("assets/images/$index.jpg"))),
    ),
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    var screenWidth = MediaQuery.of(context).size.width;
    var screenHeight = MediaQuery.of(context).size.height;

    return Scaffold(
      backgroundColor: Colors.blueGrey,
      // 使用 Center 将滑块放置在屏幕中心
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          const SizedBox(
            height: 20,
          ),
          SizedBox(
            // 使用 SizedBox 设置滑块的高度。不需要指定宽度。
            height: min(screenWidth / 3.3 * (16 / 9), screenHeight * .9),
            child: OverlappedSlider(
              widgets: widgets1, // 小部件列表
              currentIndex: 2,
              onClicked: (index) {},
            ),
          ),
          const SizedBox(
            height: 20,
          ),
          SizedBox(
            // 使用 SizedBox 设置滑块的高度。不需要指定宽度。
            height: min(
              screenWidth / 3 * (2 / 1),
              screenHeight * 0.5 * screenWidth,
            ),
            child: OverlappedSlider(
              widgets: widgets2, // 小部件列表
              currentIndex: 2,
              onClicked: (index) {},
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用overlapped_slider插件的一个简单示例。overlapped_slider是一个允许滑块在数值轴上重叠的自定义滑块组件。这在需要表示两个或更多相关联但可能部分重叠的值时非常有用。

首先,确保你已经在pubspec.yaml文件中添加了overlapped_slider依赖:

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

然后,运行flutter pub get来获取依赖。

下面是一个完整的示例代码,展示如何使用overlapped_slider

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

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

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

class OverlappedSliderDemo extends StatefulWidget {
  @override
  _OverlappedSliderDemoState createState() => _OverlappedSliderDemoState();
}

class _OverlappedSliderDemoState extends State<OverlappedSliderDemo> {
  double value1 = 0.0;
  double value2 = 1.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Overlapped Slider Demo'),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Value 1: ${value1.toStringAsFixed(1)}',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Value 2: ${value2.toStringAsFixed(1)}',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 40),
              OverlappedSlider(
                min: 0.0,
                max: 10.0,
                values: [value1, value2],
                onChanged: (double newValue1, double newValue2) {
                  setState(() {
                    value1 = newValue1;
                    value2 = newValue2;
                  });
                },
                trackHeight: 8.0,
                trackInactiveHeight: 4.0,
                trackInactiveColor: Colors.grey[300]!,
                trackColor: Colors.blue,
                thumbColor: Colors.blueAccent,
                thumbRadius: 12.0,
                label: OverlappedSliderLabel(
                  showLabels: true,
                  labelStyle: TextStyle(color: Colors.black, fontSize: 14),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先定义了两个状态变量value1value2,分别表示两个滑块的值。
  2. 使用OverlappedSlider组件来显示两个可重叠的滑块。
  3. minmax属性定义了滑块的范围。
  4. values属性接收一个包含两个值的列表,分别对应两个滑块的位置。
  5. onChanged回调在滑块值改变时被调用,用于更新状态变量。
  6. 其他属性如trackHeight, trackInactiveHeight, trackInactiveColor, trackColor, thumbColor, 和 thumbRadius用于自定义滑块的外观。
  7. label属性用于显示滑块值标签,通过OverlappedSliderLabel类进行配置。

这个示例提供了一个基本的框架,你可以根据需要进一步自定义和扩展。

回到顶部