Flutter滑动切换插件slide_switcher的使用

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

Flutter滑动切换插件slide_switcher的使用

插件简介

slide_switcher 是一个用于创建和自定义滑块的库,它允许开发者轻松地在Flutter应用程序中实现滑动切换效果。通过这个库,你可以创建水平或垂直方向的滑块,并且可以高度自定义滑块和容器的样式。

示例

主要功能特性

  • 自定义样式:可以调整容器和滑块的颜色、边框、圆角等。
  • 响应事件:提供onSelect回调函数,可以在滑块切换时触发特定逻辑。
  • 灵活布局:支持水平和垂直方向的滑动切换。
  • 简易集成:只需指定必要的参数即可快速上手。

参数说明

字段 说明
children 放置在滑块内的小部件列表,必填项。
onSelect 滑动选择时触发的回调函数,接收当前索引作为参数,必填项。
containerHeight 容器的高度,必填项。
containerWight 容器的宽度,必填项。(注意拼写错误,应为containerWidth
slidersColors 每个滑块的颜色,单个颜色会填充所有滑块,默认为白色。
slidersGradients 每个滑块的渐变色,单个渐变会填充所有滑块。
containerBorder 容器边框的小部件。
slidersBorder 滑块边框的小部件。
containerBorderRadius 容器圆角半径。
containerColor 容器背景色,默认为灰色。
indents 容器与滑块之间的内边距,默认为0。
direction 定义滑块滑动的方向,默认为水平方向。
isAllContainerTap 是否允许点击整个容器来切换滑块(仅适用于两个子元素的情况),默认为false。
containerBoxShadow 容器阴影效果。
initialIndex 初始渲染时显示的滑块索引。

使用示例

下面是一个完整的Dart代码示例,展示了如何使用slide_switcher插件创建多个不同样式的滑动切换组件:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        scaffoldBackgroundColor: Colors.white10.withOpacity(0.27),
      ),
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  int switcherIndex1 = 0;
  int switcherIndex2 = 0;
  int switcherIndex3 = 0;
  int switcherIndex4 = 0;
  int switcherIndex5 = 0;
  int switcherIndex6 = 0;
  int switcherIndex7 = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: switcherIndex1 == 0
          ? Colors.white10.withOpacity(0.27)
          : Colors.white10.withOpacity(0.2),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // 示例1:简单的开关滑块
            SlideSwitcher(
              children: [
                Container(),
                Container(),
              ],
              containerHeight: 30,
              containerWight: 60,
              isAllContainerTap: true,
              onSelect: (int index) => setState(() => switcherIndex1 = index),
              indents: 5,
              containerColor:
                  switcherIndex1 == 0 ? Colors.grey : Colors.indigo.shade300,
            ),
            const SizedBox(height: 20),

            // 示例2:带文本标签的滑块
            SlideSwitcher(
              children: [
                Text(
                  'First',
                  style: TextStyle(
                    fontWeight:
                        switcherIndex2 == 0 ? FontWeight.w500 : FontWeight.w400,
                    color:
                        switcherIndex2 == 0 ? Colors.deepOrange : Colors.white,
                  ),
                ),
                Text(
                  'Second',
                  style: TextStyle(
                    fontWeight:
                        switcherIndex2 == 1 ? FontWeight.w500 : FontWeight.w400,
                    color:
                        switcherIndex2 == 1 ? Colors.deepOrange : Colors.white,
                  ),
                ),
              ],
              containerColor: Colors.deepOrange,
              onSelect: (int index) => setState(() => switcherIndex2 = index),
              containerHeight: 40,
              containerWight: 350,
            ),
            const SizedBox(height: 20),

            // 示例3:具有初始索引和更多配置选项的滑块
            SlideSwitcher(
              children: const [
                Text(
                  'First',
                  style: TextStyle(
                    fontWeight: FontWeight.w600,
                    color: Color(0xff714F43),
                  ),
                ),
                Text(
                  'Second',
                  style: TextStyle(
                    fontWeight: FontWeight.w600,
                    color: Color(0xff714F43),
                  ),
                ),
                Text(
                  'Third',
                  style: TextStyle(
                    fontWeight: FontWeight.w600,
                    color: Color(0xff714F43),
                  ),
                ),
                Text(
                  'Forth',
                  style: TextStyle(
                    fontWeight: FontWeight.w600,
                    color: Color(0xff714F43),
                  ),
                ),
              ],
              initialIndex: 2,
              onSelect: (int index) => setState(() => switcherIndex3 = index),
              containerBorderRadius: 0,
              indents: 10,
              containerBorder: Border.all(
                width: 3,
                color: const Color(0xffFFFFE3),
              ),
              containerColor: const Color(0xffE1CCB9).withOpacity(0.8),
              slidersColors: const [
                Color(0xffFFFFE3),
              ],
              containerHeight: 50,
              containerWight: 350,
            ),
            const SizedBox(height: 20),

            // 示例4:带有渐变色滑块
            SlideSwitcher(
              children: [
                Text(
                  'First',
                  style: TextStyle(
                      fontSize: 15,
                      color: switcherIndex4 == 0
                          ? Colors.white.withOpacity(0.9)
                          : Colors.grey),
                ),
                Text(
                  'Second',
                  style: TextStyle(
                      fontSize: 15,
                      color: switcherIndex4 == 1
                          ? Colors.white.withOpacity(0.9)
                          : Colors.grey),
                ),
                Text(
                  'Third',
                  style: TextStyle(
                      fontSize: 15,
                      color: switcherIndex4 == 2
                          ? Colors.white.withOpacity(0.9)
                          : Colors.grey),
                ),
              ],
              onSelect: (int index) => setState(() => switcherIndex4 = index),
              containerColor: Colors.transparent,
              containerBorder: Border.all(color: Colors.white),
              slidersGradients: const [
                LinearGradient(
                  colors: [
                    Color.fromRGBO(47, 105, 255, 1),
                    Color.fromRGBO(188, 47, 255, 1),
                  ],
                ),
                LinearGradient(
                  colors: [
                    Color.fromRGBO(47, 105, 255, 1),
                    Color.fromRGBO(0, 192, 169, 1),
                  ],
                ),
                LinearGradient(
                  colors: [
                    Color.fromRGBO(255, 105, 105, 1),
                    Color.fromRGBO(255, 62, 62, 1),
                  ],
                ),
              ],
              indents: 9,
              containerHeight: 50,
              containerWight: 315,
            ),
            const SizedBox(height: 20),

            // 示例5:垂直方向的图标滑块
            Row(
              children: [
                const SizedBox(width: 65),
                SlideSwitcher(
                  children: const [
                    Icon(
                      Icons.account_circle_rounded,
                      color: Colors.white,
                    ),
                    Icon(
                      Icons.add_moderator,
                      color: Colors.white,
                    ),
                  ],
                  onSelect: (int index) =>
                      setState(() => switcherIndex5 = index),
                  direction: Axis.vertical,
                  containerColor: Colors.teal.withOpacity(0.5),
                  slidersColors: const [Colors.teal],
                  containerHeight: 70,
                  containerWight: 90,
                ),
                const SizedBox(width: 20),

                // 示例6:垂直方向的文字滑块
                SlideSwitcher(
                  children: const [
                    Text(
                      'First',
                      style: TextStyle(
                        color: Color.fromRGBO(53, 90, 242, 1),
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                    Text(
                      'Second',
                      style: TextStyle(
                        color: Color.fromRGBO(53, 90, 242, 1),
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                    Text(
                      'Third',
                      style: TextStyle(
                        color: Color.fromRGBO(53, 90, 242, 1),
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                    Text(
                      'Forth',
                      style: TextStyle(
                        color: Color.fromRGBO(53, 90, 242, 1),
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                    Text(
                      'Fifth',
                      style: TextStyle(
                        color: Color.fromRGBO(53, 90, 242, 1),
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                  ],
                  onSelect: (int index) =>
                      setState(() => switcherIndex6 = index),
                  slidersColors: const [Colors.white],
                  containerHeight: 320,
                  containerWight: 60,
                  indents: 4,
                  direction: Axis.vertical,
                  containerColor: const Color.fromRGBO(140, 176, 254, 1),
                ),
                const SizedBox(width: 20),

                // 示例7:透明背景的垂直滑块
                SlideSwitcher(
                  children: const [
                    Text(
                      'F',
                      style: TextStyle(
                        color: Colors.white,
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                    Text(
                      'S',
                      style: TextStyle(
                        color: Colors.white,
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                  ],
                  direction: Axis.vertical,
                  containerColor: Colors.purple,
                  slidersColors: [Colors.transparent],
                  slidersBorder: Border.all(color: Colors.white, width: 2),
                  containerBorder: Border.all(color: Colors.white, width: 2),
                  containerHeight: 300,
                  containerWight: 40,
                  indents: 5,
                  onSelect: (int index) =>
                      setState(() => switcherIndex7 = index),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  • 确保children中的所有小部件都能适应给定的容器尺寸,否则可能会出现异常。
  • children长度为2时,可以设置isAllContainerTaptrue以实现点击整个容器切换滑块的功能。
  • 如果需要垂直方向的滑块,请记得设置direction: Axis.vertical

希望以上内容能够帮助您更好地理解和使用slide_switcher插件!如果有任何问题或建议,欢迎随时提出。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用slide_switcher插件进行滑动切换的示例代码。slide_switcher并不是Flutter官方的一个widget,但基于你的需求,我假设你想实现一个滑动切换的效果,通常这可以通过PageView来实现。如果slide_switcher是一个第三方包,你可以查阅它的文档来获取具体用法,但这里我将展示如何使用PageView实现类似的滑动切换效果。

首先,确保你的pubspec.yaml文件中包含了Flutter SDK的基本依赖,并且没有特别的第三方包依赖(除非slide_switcher是必需的,但在此例中我们用PageView)。

name: flutter_slide_switcher_example
description: A new Flutter project.

version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  flutter_test:
    sdk: flutter

接下来,在你的main.dart文件中,你可以实现一个简单的滑动切换界面:

import 'package:flutter/material.dart';

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

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

class SlideSwitcherScreen extends StatefulWidget {
  @override
  _SlideSwitcherScreenState createState() => _SlideSwitcherScreenState();
}

class _SlideSwitcherScreenState extends State<SlideSwitcherScreen> {
  final List<String> pages = ['Page 1', 'Page 2', 'Page 3'];
  int _currentPage = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Slide Switcher Example'),
      ),
      body: Center(
        child: PageView.builder(
          itemCount: pages.length,
          itemBuilder: (context, index) {
            return Center(
              child: Text(
                pages[index],
                style: TextStyle(fontSize: 24),
              ),
            );
          },
          onPageChanged: (int index) {
            setState(() {
              _currentPage = index;
            });
          },
          controller: PageController(initialPage: _currentPage),
        ),
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.business),
            label: 'Business',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.school),
            label: 'School',
          ),
        ],
        currentIndex: _currentPage,
        onTap: (int index) {
          setState(() {
            _currentPage = index;
          });
        },
      ),
    );
  }
}

在这个例子中,我们使用了PageView.builder来创建可滑动的页面视图,每个页面显示一个简单的文本。BottomNavigationBar用于在底部显示导航项,当用户点击不同的导航项时,页面会切换到相应的内容。

  • PageView.builderitemBuilder属性用于构建每个页面。
  • onPageChanged回调用于更新当前页面的索引。
  • BottomNavigationBaronTap回调也用于更新当前页面的索引,以实现页面与底部导航项的同步。

如果你确实在使用一个名为slide_switcher的第三方包,请参考该包的官方文档,因为具体用法可能会有所不同。通常,第三方包的文档会提供详细的安装指南和使用示例。

回到顶部