Flutter PageView 实现的自动轮播图效果 Timer实现的自动轮播效果
2023-09-11 14:14:53 时间
题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。
Flutter是谷歌推出的最新的移动开发框架。
【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过 文章底部扫码关注
如下图所示,你的APP项目中一定会应用到这样的场景。
页面的主体使用 Scaffold 来搭建,代码如下:
class Homepage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _HomepageState();
}
}
class _HomepageState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("轮播图"),
),
body: Container(
child: buildBanner(),
),
);
}
... ...
}
通过层叠布局 Stack 将轮播图与索引指示器组合在一起,代码如下:
Widget buildBanner() {
return Container(
height: 200,
width: double.infinity,
child: Stack(
children: [
//轮播图片
buildBannerWidget(),
//指示器
buildTipsWidget(),
],
),
);
}
轮播的图片是使用 PageView 来装载,代码如下:
buildBannerWidget() {
//懒加载方式构建
return PageView.builder(
//构建每一个子Item的布局
itemBuilder: (BuildContext context, int index) {
return buildPageViewItemWidget(index);
},
//控制器
controller: _pageController,
//轮播个数 无限轮播 ??
itemCount: imageList.length * 10000,
//PageView滑动时回调
onPageChanged: (int index) {
setState(() {
currentIndex = index;
});
},
);
}
PageView 中构建的每一个子Item 只是一个图片,代码如下:
//轮播显示图片
buildPageViewItemWidget(int index) {
return Image.asset(
imageList[index % imageList.length],
fit: BoxFit.fill,
);
}
//指示器
buildTipsWidget() {
return Positioned(
bottom: 20,
right: 20,
child: Container(
//内边距
padding: EdgeInsets.only(left: 8, right: 8, top: 2, bottom: 2),
//圆角边框
decoration: BoxDecoration(
//背景
color: Colors.white,
//边框圆角
borderRadius: BorderRadius.all(Radius.circular(10))),
child:
Text("${currentIndex % imageList.length + 1}/${imageList.length}"),
),
);
}
在这里需要初始化的数据如下:
//轮播图 PageView 使用的控制器
PageController _pageController;
//定时器自动轮播
Timer _timer;
//本地资源图片
List<String> imageList = [
"images/banner1.webp",
"images/banner2.webp",
"images/banner3.webp",
"images/banner4.webp",
];
//当前显示的索引
int currentIndex = 1000;
定时器 Timer 的创建与销毁 代码如下:
@override
void initState() {
super.initState();
//初始化控制器
// initialPage 为初始化显示的子Item
_pageController = new PageController(initialPage: currentIndex);
///当前页面绘制完第一帧后回调
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
startTimer();
});
}
@override
void dispose() {
super.dispose();
_timer.cancel();
}
定时器的轮播 触发PageView的自动切换,代码如下:
void startTimer() {
//间隔两秒时间
_timer = new Timer.periodic(Duration(milliseconds: 2000), (value) {
print("定时器");
currentIndex++;
//触发轮播切换
_pageController.animateToPage(currentIndex,
duration: Duration(milliseconds: 200), curve: Curves.ease);
//刷新
setState(() {
});
});
}
以小编的性格,要实现百万Demo随时复制粘贴肯定是需要源码的
当然以小编的性格,肯定是要有视频录制的,点击这里查看,有兴趣 你可以关注一下 西瓜视频 — 早起的年轻人
相关文章
- Flutter NavigationBar 优雅的实现底部导航栏菜单
- Flutter 调用高德地图APP实现位置搜索、路线规划、逆地理编码
- Flutter 自定义绘制 View
- flutter主题颜色
- Flutter 精品项目大全之 完整UI组件商城项目(教程含源码)
- flutter系列之:深入理解布局的基础constraints
- Flutter 中 stateless 和 stateful widget 的区别[Flutter专题60]
- Flutter & Dart:用数字分组显示大数字
- Flutter 构建一个完整的聊天应用程序
- Flutter Doctor:Xcode 安装不完整
- Flutter 学习之旅 之 flutter 工程目录文件夹说明,以及几个简单 Flutter 案例
- Flutter开发 -flutter百度地图接入指南,外加定位,反地理编码,这些功能组成一个类似饿了么的配送员配送界面,这些功能你心动么?
- Flutter开发-[iOS Crash] Crash on some iPhone when running the app on Flutter SDK1.17.0/1.17.2/1.17.4