/
test_slid_banner_page.dart
168 lines (143 loc) · 3.67 KB
/
test_slid_banner_page.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
/// 创建人: Created by zhaolong
/// 创建时间:Created by on 2020/11/2.
///
/// 可关注公众号:我的大前端生涯 获取最新技术分享
/// 可关注网易云课堂:https://study.163.com/instructor/1021406098.htm
/// 可关注博客:https://blog.csdn.net/zl18603543572
///
void main() {
runApp(RootApp());
}
class RootApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BannerHomepage(),
);
}
}
class BannerHomepage extends StatefulWidget {
final bool isTitle;
BannerHomepage({this.isTitle=true});
@override
State<StatefulWidget> createState() {
return _BannerHomepageState();
}
}
class _BannerHomepageState extends State<BannerHomepage> {
//轮播图 PageView 使用的控制器
PageController _pageController;
//定时器自动轮播
Timer _timer;
//本地资源图片
List<String> imageList = [
"assets/images/banner1.webp",
"assets/images/banner2.webp",
"assets/images/banner3.webp",
"assets/images/banner4.webp",
];
//当前显示的索引
int currentIndex = 1000;
@override
void initState() {
super.initState();
//初始化控制器
// initialPage 为初始化显示的子Item
_pageController = new PageController(initialPage: currentIndex);
///当前页面绘制完第一帧后回调
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
startTimer();
});
}
@override
void dispose() {
super.dispose();
_timer.cancel();
}
void startTimer() {
//间隔两秒时间
_timer = new Timer.periodic(Duration(milliseconds: 2000), (value) {
print("定时器");
currentIndex++;
//触发轮播切换
_pageController.animateToPage(currentIndex,
duration: Duration(milliseconds: 200), curve: Curves.ease);
//刷新
setState(() {
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar:widget.isTitle? AppBar(
title: Text("轮播图"),
):null,
body: Container(
child: buildBanner(),
),
);
}
Widget buildBanner() {
return Container(
// height: 200,
width: double.infinity,
child: Stack(
children: [
//轮播图片
buildBannerWidget(),
//指示器
buildTipsWidget(),
],
),
);
}
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;
});
},
);
}
//轮播显示图片
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}"),
),
);
}
}