热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter实现轮播图banner

先上效果图:flutter的Swiper控件,实现无线轮播:1.准备首先打开pubspec.yaml文件,添加控件依赖

 先上效果图:

flutter的Swiper控件,实现无线轮播:

1.准备

首先打开pubspec.yaml文件,添加控件依赖

flutter_swiper: ^1.0.6 //请在pub上查看最新版本

运行命令:flutter packages get 

2.使用

完整的dart代码

import 'package:flutter/material.dart';
import 'package:flutter_swiper/flutter_swiper.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:fluttertoast/fluttertoast.dart';final List images = ['images/viewpage_ima1.jpg','images/viewpage_ima2.jpg','images/viewpage_ima3.jpeg?s=#39;,'images/viewpage_ima4.jpg','images/icon_bg.jpg',
];final List descriptions = ['莲,出淤泥而不染','社会我宝姐,人美路子野','周五快到了,准备追更新','送你一辆奥迪','我家狗狗好看吗',
];
class MySwiperPage extends StatefulWidget {@overrideSwiperPageState createState() {return SwiperPageState();}
}
class SwiperPageState extends State {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('轮播组件'),),body: Column(children: [Container(width: MediaQuery.of(context).size.width,margin: const EdgeInsets.only(bottom: 10.0),height: 180.0,child: Swiper(itemBuilder: _swiperBuilder,itemCount: images.length,pagination: new SwiperPagination(builder: DotSwiperPaginationBuilder(color: Colors.black38,activeColor: Colors.blueAccent,)),control: null,duration: 300,
// viewportFraction: 0.9,scrollDirection: Axis.horizontal,autoplay: true,onTap: (int index){Fluttertoast.showToast(msg: '点击了第$index个');},)),Center(child: SizedBox.fromSize(size: Size.fromHeight(180.0),child: Swiper(itemBuilder: (BuildContext context, int index) {return Padding(padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 0.0),child: GestureDetector(onTap: () {Fluttertoast.showToast(msg: descriptions[index]);},child: ClipRRect(borderRadius: BorderRadius.circular(6.0),child: Stack(fit: StackFit.expand,children: [Image.asset(images[index], fit: BoxFit.cover),],),),),);},itemCount: images.length,//选中时的指示器pagination: new SwiperPagination(builder: DotSwiperPaginationBuilder(color: Colors.black38,activeColor: Colors.white,),margin: const EdgeInsets.only(bottom: 22.0)),control: null,duration: 300,scrollDirection: Axis.horizontal,viewportFraction: 0.8,scale: 0.85,autoplay: true,onTap: (int index) {Fluttertoast.showToast(msg: '点击了第$index个');},),)),Center(child: SizedBox.fromSize(size: Size.fromHeight(180.0),child: Swiper(itemBuilder: (BuildContext context, int index) {return Padding(padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 15.0),child: GestureDetector(onTap: () {Fluttertoast.showToast(msg: descriptions[index]);},child: ClipRRect(
// elevation: 5.0,borderRadius: BorderRadius.circular(6.0),child: Stack(fit: StackFit.expand,children: [Image.asset(images[index], fit: BoxFit.cover),
// decorationBox,],),),),);},itemCount: images.length,//选中时的指示器pagination: new SwiperPagination(builder: DotSwiperPaginationBuilder(color: Colors.black38,activeColor: Colors.white,),margin: const EdgeInsets.only(bottom: 22.0)),control: null,duration: 300,scrollDirection: Axis.horizontal,viewportFraction: 0.95,autoplay: true,onTap: (int index) {Fluttertoast.showToast(msg: '点击了第$index个');},),))],));}Widget _swiperBuilder(BuildContext context, int index) {return (Image.asset(images[index],fit: BoxFit.fill,));}void _goOtherApp(int index) async {const url = 'https://www.baidu.com'; //这个url就是由scheme和host组成的 :scheme://hostif (await canLaunch(url)) {await launch(url);} else {throw 'Could not launch $url';}}
}

上面代码中用到了toast,所以需要添加toast的依赖,如果点击图片需要跳转H5页面还需要添加url_launcher依赖,方法与swiper类似,在pubspec.yaml文件中添加

fluttertoast: ^2.2.11
flutter_swiper: ^1.0.6
url_launcher: ^5.0.3

Swiper基本参数 


参数默认值描述
scrollDirectionAxis.horizontal滚动方向,设置为Axis.vertical如果需要垂直滚动
looptrue无线轮播模式开关
index0初始的时候下标位置
autoplayfalse自动播放开关
autoplayDely3000自动播放延迟毫秒数
autoplayDiableOnInteractiontrue当用户拖拽的时候,是否停止自动播放.
onIndexChangedvoid onIndexChanged(int index)当用户手动拖拽或者自动播放引起下标改变的时候调用
onTapvoid onTap(int index)当用户点击某个轮播的时候调用
duration300.0动画时间,单位是毫秒
paginationnull设置 new SwiperPagination() 展示默认分页指示器
controlnull设置 new SwiperControl() 展示默认分页按钮

 


 

 

 

 

 

 

 

 

 

 

分页指示器 pagination

即banner下面的小圆点,随着banner轮播而滑动

参数默认值描述
alignmentAlignment.bottomCenter如果要将分页指示器放到其他位置,那么可以修改这个参数
marginconst EdgeInsets.all(10.0)分页指示器与容器边框的距离
builderSwiperPagination.dots目前已经定义了两个默认的分页指示器样式: SwiperPagination.dots 、 SwiperPagination.fraction,都可以做进一步的自定义.

 

 

 

 

 

 


简单的自定义

pagination: new SwiperPagination(builder: DotSwiperPaginationBuilder(color: Colors.black38,activeColor: Colors.white,),margin: const EdgeInsets.only(bottom: 22.0))

完全自定义指示器

new Swiper(...,pagination:new SwiperCustomPagination(builder:(BuildContext context, SwiperPluginConfig config){return new YourOwnPagination();})
);

 控制按钮 control

Swiper的control属性,也就是banner左右两边的按钮,它是继承自 SwiperPlugin,设置 new SwiperControl() 展示默认控制按钮

 如果不想要控制按钮,swiper的control属性设置为null

参数默认值描述
iconPreviousIcons.arrow_back_ios上一页的IconData
iconNextIcons.arrow_forward_ios下一页的IconData
colorTheme.of(context).primaryColor控制按钮颜色
size30.0控制按钮大小
paddingconst EdgeInsets.all(5.0)控制按钮与容器的距离

 

 

 

 

 

 

 

控制器(SwiperController)

SwiperController 用于控制 Swiper的index属性, 停止和开始自动播放. 通过 new SwiperController() 创建一个SwiperController实例,并保存,以便将来能使用。

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

 

 


 


 


 


 


Swiper的layout属性,布局

1.SwiperLayout.STACK

注意:如果使用Swiper的layout属性,必须要有itemWidth属性,否则会报错

在原来第二个banner的基础上加上两句代码:

itemWidth: 300.0,
layout: SwiperLayout.STACK,

2.SwiperLayout.CUSTOM

在原来第三个banner基础上加上以下代码

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: 300.0,

3.layout: SwiperLayout.TINDER

在原来第二个banner基础上加上并修改以下代码 ,注意:itemWidthitemHeight必须设置,否则报错

size: Size.fromHeight(280.0),//为了好看点,修改下高度
//新增以下代码
itemWidth: 350.0,
itemHeight: 250.0,//高度必须设置
layout: SwiperLayout.TINDER


推荐阅读
author-avatar
mobiledu2502885111
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有