Flutter轮播图插件sing_swiper的使用

Flutter轮播图插件sing_swiper的使用

安装

在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
   sing_swiper: ^0.0.1
来源

flutter_swiper 是 flutter 最强大的轮播插件之一,支持多种布局方式、无限轮播,并且能够在 Android 和 iOS 上完美适配。


基本参数

以下是 Swiper 的一些常用参数及默认值:

参数 默认值 描述
scrollDirection Axis.horizontal 滚动方向,设置为 Axis.vertical 如果需要垂直滚动
loop true 是否启用无限轮播模式
index 0 初始时的下标位置
autoplay false 是否开启自动播放
onIndexChanged void onIndexChanged(int index) 当用户手动拖拽或自动播放引起下标改变时调用
onTap void onTap(int index) 当用户点击某个轮播项时触发
duration 300.0 动画持续时间,单位为毫秒
pagination null 设置 new SwiperPagination() 展示默认分页指示器
control null 设置 new SwiperControl() 展示默认分页按钮

分页指示器

分页指示器通过 SwiperPlugin 提供,可以使用 new SwiperPagination() 来展示默认分页指示器。

参数表

参数 默认值 描述
alignment Alignment.bottomCenter 分页指示器的位置,可以通过修改此参数调整到其他位置
margin const EdgeInsets.all(10.0) 分页指示器与容器边缘的距离
builder SwiperPagination.dots 支持两种默认样式:SwiperPagination.dotsSwiperPagination.fraction

自定义分页指示器

如果需要自定义分页指示器,可以这样实现:

new Swiper(
  pagination: new SwiperCustomPagination(
    builder: (BuildContext context, SwiperPluginConfig config) {
      return new Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: List.generate(config.itemCount, (index) {
          return Container(
            width: 10.0,
            height: 10.0,
            margin: EdgeInsets.symmetric(horizontal: 5.0),
            decoration: BoxDecoration(
              shape: BoxShape.circle,
              color: config.activeIndex == index ? Colors.blue : Colors.grey,
            ),
          );
        }),
      );
    },
  ),
);

控制按钮

控制按钮同样通过 SwiperPlugin 提供,使用 new SwiperControl() 展示默认控制按钮。

参数表

参数 默认值 描述
iconPrevious Icons.arrow_back_ios 上一页图标
iconNext Icons.arrow_forward_ios 下一页图标
color Theme.of(context).primaryColor 按钮颜色
size 30.0 按钮大小
padding const EdgeInsets.all(5.0) 按钮与容器边缘的距离

控制器(SwiperController)

SwiperController 用于控制轮播图的当前下标、启动和停止自动播放。创建一个 SwiperController 实例并保存,以便将来使用。

方法

方法 描述
void move(int index, {bool animation: true}) 移动到指定下标,可选是否播放动画
void next({bool animation: true}) 跳转到下一页,可选是否播放动画
void previous({bool animation: true}) 跳转到上一页,可选是否播放动画
void startAutoplay() 启动自动播放
void stopAutoplay() 停止自动播放

自动播放

自动播放的相关参数:

参数 默认值 描述
autoplayDelay 3000 自动播放的延迟时间(毫秒)
autoplayDisableOnInteraction true 用户交互时是否暂停自动播放

内建布局

Swiper 提供了多种内置布局方式,方便快速实现不同效果。

示例代码

水平布局(Default)

new Swiper(
  itemBuilder: (BuildContext context, int index) {
    return new Image.network(
      "http://via.placeholder.com/288x188",
      fit: BoxFit.fill,
    );
  },
  itemCount: 10,
  viewportFraction: 0.8,
  scale: 0.9,
)

栈布局(Stack)

new Swiper(
  itemBuilder: (BuildContext context, int index) {
    return new Image.network(
      "http://via.placeholder.com/288x188",
      fit: BoxFit.fill,
    );
  },
  itemCount: 10,
  itemWidth: 300.0,
  layout: SwiperLayout.STACK,
)

扑克牌布局(Tinder)

new Swiper(
  itemBuilder: (BuildContext context, int index) {
    return new Image.network(
      "http://via.placeholder.com/288x188",
      fit: BoxFit.fill,
    );
  },
  itemCount: 10,
  itemWidth: 300.0,
  itemHeight: 400.0,
  layout: SwiperLayout.TINDER,
)

自定义布局

new Swiper(
  layout: SwiperLayout.CUSTOM,
  customLayoutOption: new CustomLayoutOption(
      startIndex: -1,
      stateCount: 3
  ).addRotate([
    -45.0 / 180,
    0.0,
    45.0 / 180
  ]).addTranslate([
    new Offset(-370.0, -40.0),
    new Offset(0.0, 0.0),
    new Offset(370.0, -40.0)
  ]),
  itemWidth: 300.0,
  itemHeight: 200.0,
  itemBuilder: (context, index) {
    return new Container(
      color: Colors.grey,
      child: new Center(
        child: new Text("$index"),
      ),
    );
  },
  itemCount: 10)

完整示例代码

以下是一个完整的示例代码,展示了如何使用 sing_swiper 插件实现轮播图。

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

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

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

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: Center(
        child: Swiper(
          autoplay: true,
          itemCount: 5,
          itemBuilder: (BuildContext context, int index) {
            return Image.network(
              "https://picsum.photos/200/300?random=$index",
              fit: BoxFit.cover,
            );
          },
          pagination: const SwiperPagination(),
          control: const SwiperControl(),
        ),
      ),
    );
  }
}
1 回复

更多关于Flutter轮播图插件sing_swiper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


sing_swiper 是一个用于 Flutter 的轮播图插件,它提供了多种轮播效果和自定义选项。以下是如何在 Flutter 项目中使用 sing_swiper 插件的步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 sing_swiper 插件的依赖:

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

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

2. 导入包

在需要使用轮播图的 Dart 文件中导入 sing_swiper 包:

import 'package:sing_swiper/sing_swiper.dart';

3. 使用 SingSwiper

SingSwiper 是一个简单的轮播图组件,你可以通过传递一个 List<Widget> 来显示多个页面。

以下是一个简单的示例:

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SingSwiper Example'),
      ),
      body: SingSwiper(
        itemCount: 3,
        itemBuilder: (BuildContext context, int index) {
          return Container(
            color: Colors.primaries[index % Colors.primaries.length],
            child: Center(
              child: Text(
                'Page $index',
                style: TextStyle(fontSize: 24, color: Colors.white),
              ),
            ),
          );
        },
        autoplay: true,
        duration: 3000,
        loop: true,
        pagination: true,
      ),
    );
  }
}

4. 参数说明

SingSwiper 提供了多个参数来定制轮播图的行为和外观:

  • itemCount: 轮播图的数量。
  • itemBuilder: 用于构建每个轮播图页面的回调函数。
  • autoplay: 是否自动播放,默认为 false
  • duration: 自动播放的时间间隔,单位为毫秒。
  • loop: 是否循环播放,默认为 false
  • pagination: 是否显示分页指示器,默认为 false
  • paginationBuilder: 自定义分页指示器的构建函数。
  • onTap: 点击轮播图时的回调函数。
  • onIndexChanged: 轮播图索引变化时的回调函数。

5. 自定义分页指示器

你可以通过 paginationBuilder 参数来自定义分页指示器。以下是一个自定义分页指示器的示例:

SingSwiper(
  itemCount: 3,
  itemBuilder: (BuildContext context, int index) {
    return Container(
      color: Colors.primaries[index % Colors.primaries.length],
      child: Center(
        child: Text(
          'Page $index',
          style: TextStyle(fontSize: 24, color: Colors.white),
        ),
      ),
    );
  },
  autoplay: true,
  duration: 3000,
  loop: true,
  pagination: true,
  paginationBuilder: (BuildContext context, int index, int total) {
    return Container(
      margin: EdgeInsets.only(bottom: 20),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: List.generate(total, (i) {
          return Container(
            margin: EdgeInsets.symmetric(horizontal: 4),
            width: 8,
            height: 8,
            decoration: BoxDecoration(
              shape: BoxShape.circle,
              color: i == index ? Colors.blue : Colors.grey,
            ),
          );
        }),
      ),
    );
  },
);

6. 处理点击事件

你可以通过 onTap 参数来处理轮播图的点击事件:

SingSwiper(
  itemCount: 3,
  itemBuilder: (BuildContext context, int index) {
    return Container(
      color: Colors.primaries[index % Colors.primaries.length],
      child: Center(
        child: Text(
          'Page $index',
          style: TextStyle(fontSize: 24, color: Colors.white),
        ),
      ),
    );
  },
  autoplay: true,
  duration: 3000,
  loop: true,
  pagination: true,
  onTap: (int index) {
    print('Tapped on page $index');
  },
);

7. 处理索引变化

你可以通过 onIndexChanged 参数来监听轮播图索引的变化:

SingSwiper(
  itemCount: 3,
  itemBuilder: (BuildContext context, int index) {
    return Container(
      color: Colors.primaries[index % Colors.primaries.length],
      child: Center(
        child: Text(
          'Page $index',
          style: TextStyle(fontSize: 24, color: Colors.white),
        ),
      ),
    );
  },
  autoplay: true,
  duration: 3000,
  loop: true,
  pagination: true,
  onIndexChanged: (int index) {
    print('Current index: $index');
  },
);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!