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.dots 和 SwiperPagination.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(),
),
),
);
}
}
更多关于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');
},
);