├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── banner.iml
├── lib
└── banner.dart
├── pubspec.lock
├── pubspec.yaml
└── test
└── banner_test.dart
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .atom/
3 | .idea
4 | .packages
5 | .pub/
6 | packages
7 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## [0.0.1] - TODO: Add release date.
2 |
3 | * TODO: Describe initial release.
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | TODO: Add your license here.
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # BannerView
2 |
3 | flutter的轮播图控件
4 |
5 | ## Getting Started
6 |
7 | For help getting started with Flutter, view our online [documentation](https://flutter.io/).
8 |
9 | For help on editing package code, view the [documentation](https://flutter.io/developing-packages/).
10 |
11 | ###属性
12 | * data 传入list<*>
13 | * onBannerClickListener(index,itemData) 点击事件
14 | * delayTime 秒 延迟多少秒进入下一页
15 | * scrollTime 毫秒 滑动至下页需要秒数
16 | * height 高度
17 | * buildShowView(index,itemData) 返回一个用于展示的widget
18 |
19 | ###例子
20 | ```
21 | new BannerView(
22 | data: ['a', 'b', 'c'],
23 | buildShowView: (index,data) {
24 | print(data);
25 | return new CustomWidget(text: data);
26 | },
27 | onBannerClickListener: (index,data){
28 | print(index);
29 | },
30 | ),
31 | ```
--------------------------------------------------------------------------------
/banner.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/lib/banner.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:ui' as ui;
3 | import 'package:flutter/foundation.dart';
4 | import 'package:flutter/material.dart';
5 |
6 | typedef void OnBannerClickListener(int index, D itemData);
7 | typedef Widget BuildShowView(int index, D itemData);
8 |
9 | const IntegerMax = 0x7fffffff;
10 |
11 | class BannerView extends StatefulWidget {
12 | final OnBannerClickListener onBannerClickListener;
13 |
14 | //延迟多少秒进入下一页
15 | final int delayTime; //秒
16 | //滑动需要秒数
17 | final int scrollTime; //毫秒
18 | final double height;
19 | final List data;
20 | final BuildShowView buildShowView;
21 |
22 | BannerView(
23 | {Key key,
24 | @required this.data,
25 | @required this.buildShowView,
26 | this.onBannerClickListener,
27 | this.delayTime = 3,
28 | this.scrollTime = 200,
29 | this.height = 200.0})
30 | : super(key: key);
31 |
32 | @override
33 | State createState() => new BannerViewState();
34 | }
35 |
36 | class BannerViewState extends State {
37 | // double.infinity
38 | final pageController = new PageController(initialPage: IntegerMax ~/ 2);
39 | Timer timer;
40 |
41 | BannerViewState() {
42 | // print(widget.delayTime);
43 | }
44 |
45 | @override
46 | void initState() {
47 | super.initState();
48 | resetTimer();
49 | }
50 |
51 | resetTimer() {
52 | clearTimer();
53 | timer = new Timer.periodic(new Duration(seconds: widget.delayTime),
54 | (Timer timer) {
55 | if (pageController.positions.isNotEmpty) {
56 | var i = pageController.page.toInt() + 1;
57 | pageController.animateToPage(i == 3 ? 0 : i,
58 | duration: new Duration(milliseconds: widget.scrollTime),
59 | curve: Curves.linear);
60 | }
61 | });
62 | }
63 |
64 | clearTimer() {
65 | if (timer != null) {
66 | timer.cancel();
67 | timer = null;
68 | }
69 | }
70 |
71 | @override
72 | Widget build(BuildContext context) {
73 | double screenWidth = MediaQueryData.fromWindow(ui.window).size.width;
74 | return new SizedBox(
75 | height: widget.height,
76 | child: widget.data.length == 0
77 | ? null
78 | : new GestureDetector(
79 | onTap: () {
80 | // print(pageController.page);
81 | // print(pageController.page.round());
82 | widget.onBannerClickListener(
83 | pageController.page.round() % widget.data.length,
84 | widget.data[
85 | pageController.page.round() % widget.data.length]);
86 | },
87 | onTapDown: (details) {
88 | // print('onTapDown');
89 | clearTimer();
90 | },
91 | onTapUp: (details) {
92 | // print('onTapUp');
93 | resetTimer();
94 | },
95 | onTapCancel: () {
96 | resetTimer();
97 | },
98 | child: new PageView.builder(
99 | controller: pageController,
100 | physics: const PageScrollPhysics(
101 | parent: const ClampingScrollPhysics()),
102 | itemBuilder: (BuildContext context, int index) {
103 | return widget.buildShowView(
104 | index, widget.data[index % widget.data.length]);
105 | },
106 | itemCount: IntegerMax,
107 | ),
108 | ));
109 | }
110 |
111 | @override
112 | void dispose() {
113 | clearTimer();
114 | super.dispose();
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile
3 | packages:
4 | analyzer:
5 | dependency: transitive
6 | description:
7 | name: analyzer
8 | url: "https://pub.dartlang.org"
9 | source: hosted
10 | version: "0.32.4"
11 | args:
12 | dependency: transitive
13 | description:
14 | name: args
15 | url: "https://pub.dartlang.org"
16 | source: hosted
17 | version: "1.5.0"
18 | async:
19 | dependency: transitive
20 | description:
21 | name: async
22 | url: "https://pub.dartlang.org"
23 | source: hosted
24 | version: "2.0.8"
25 | boolean_selector:
26 | dependency: transitive
27 | description:
28 | name: boolean_selector
29 | url: "https://pub.dartlang.org"
30 | source: hosted
31 | version: "1.0.4"
32 | charcode:
33 | dependency: transitive
34 | description:
35 | name: charcode
36 | url: "https://pub.dartlang.org"
37 | source: hosted
38 | version: "1.1.2"
39 | collection:
40 | dependency: transitive
41 | description:
42 | name: collection
43 | url: "https://pub.dartlang.org"
44 | source: hosted
45 | version: "1.14.11"
46 | convert:
47 | dependency: transitive
48 | description:
49 | name: convert
50 | url: "https://pub.dartlang.org"
51 | source: hosted
52 | version: "2.0.2"
53 | crypto:
54 | dependency: transitive
55 | description:
56 | name: crypto
57 | url: "https://pub.dartlang.org"
58 | source: hosted
59 | version: "2.0.6"
60 | csslib:
61 | dependency: transitive
62 | description:
63 | name: csslib
64 | url: "https://pub.dartlang.org"
65 | source: hosted
66 | version: "0.14.5"
67 | flutter:
68 | dependency: "direct main"
69 | description: flutter
70 | source: sdk
71 | version: "0.0.0"
72 | flutter_test:
73 | dependency: "direct dev"
74 | description: flutter
75 | source: sdk
76 | version: "0.0.0"
77 | front_end:
78 | dependency: transitive
79 | description:
80 | name: front_end
81 | url: "https://pub.dartlang.org"
82 | source: hosted
83 | version: "0.1.4"
84 | glob:
85 | dependency: transitive
86 | description:
87 | name: glob
88 | url: "https://pub.dartlang.org"
89 | source: hosted
90 | version: "1.1.7"
91 | html:
92 | dependency: transitive
93 | description:
94 | name: html
95 | url: "https://pub.dartlang.org"
96 | source: hosted
97 | version: "0.13.3+3"
98 | http:
99 | dependency: transitive
100 | description:
101 | name: http
102 | url: "https://pub.dartlang.org"
103 | source: hosted
104 | version: "0.11.3+17"
105 | http_multi_server:
106 | dependency: transitive
107 | description:
108 | name: http_multi_server
109 | url: "https://pub.dartlang.org"
110 | source: hosted
111 | version: "2.0.5"
112 | http_parser:
113 | dependency: transitive
114 | description:
115 | name: http_parser
116 | url: "https://pub.dartlang.org"
117 | source: hosted
118 | version: "3.1.3"
119 | io:
120 | dependency: transitive
121 | description:
122 | name: io
123 | url: "https://pub.dartlang.org"
124 | source: hosted
125 | version: "0.3.3"
126 | js:
127 | dependency: transitive
128 | description:
129 | name: js
130 | url: "https://pub.dartlang.org"
131 | source: hosted
132 | version: "0.6.1+1"
133 | json_rpc_2:
134 | dependency: transitive
135 | description:
136 | name: json_rpc_2
137 | url: "https://pub.dartlang.org"
138 | source: hosted
139 | version: "2.0.9"
140 | kernel:
141 | dependency: transitive
142 | description:
143 | name: kernel
144 | url: "https://pub.dartlang.org"
145 | source: hosted
146 | version: "0.3.4"
147 | logging:
148 | dependency: transitive
149 | description:
150 | name: logging
151 | url: "https://pub.dartlang.org"
152 | source: hosted
153 | version: "0.11.3+2"
154 | matcher:
155 | dependency: transitive
156 | description:
157 | name: matcher
158 | url: "https://pub.dartlang.org"
159 | source: hosted
160 | version: "0.12.3+1"
161 | meta:
162 | dependency: transitive
163 | description:
164 | name: meta
165 | url: "https://pub.dartlang.org"
166 | source: hosted
167 | version: "1.1.6"
168 | mime:
169 | dependency: transitive
170 | description:
171 | name: mime
172 | url: "https://pub.dartlang.org"
173 | source: hosted
174 | version: "0.9.6+2"
175 | multi_server_socket:
176 | dependency: transitive
177 | description:
178 | name: multi_server_socket
179 | url: "https://pub.dartlang.org"
180 | source: hosted
181 | version: "1.0.2"
182 | node_preamble:
183 | dependency: transitive
184 | description:
185 | name: node_preamble
186 | url: "https://pub.dartlang.org"
187 | source: hosted
188 | version: "1.4.4"
189 | package_config:
190 | dependency: transitive
191 | description:
192 | name: package_config
193 | url: "https://pub.dartlang.org"
194 | source: hosted
195 | version: "1.0.5"
196 | package_resolver:
197 | dependency: transitive
198 | description:
199 | name: package_resolver
200 | url: "https://pub.dartlang.org"
201 | source: hosted
202 | version: "1.0.4"
203 | path:
204 | dependency: transitive
205 | description:
206 | name: path
207 | url: "https://pub.dartlang.org"
208 | source: hosted
209 | version: "1.6.2"
210 | plugin:
211 | dependency: transitive
212 | description:
213 | name: plugin
214 | url: "https://pub.dartlang.org"
215 | source: hosted
216 | version: "0.2.0+3"
217 | pool:
218 | dependency: transitive
219 | description:
220 | name: pool
221 | url: "https://pub.dartlang.org"
222 | source: hosted
223 | version: "1.3.6"
224 | pub_semver:
225 | dependency: transitive
226 | description:
227 | name: pub_semver
228 | url: "https://pub.dartlang.org"
229 | source: hosted
230 | version: "1.4.2"
231 | quiver:
232 | dependency: transitive
233 | description:
234 | name: quiver
235 | url: "https://pub.dartlang.org"
236 | source: hosted
237 | version: "2.0.0+1"
238 | shelf:
239 | dependency: transitive
240 | description:
241 | name: shelf
242 | url: "https://pub.dartlang.org"
243 | source: hosted
244 | version: "0.7.3+3"
245 | shelf_packages_handler:
246 | dependency: transitive
247 | description:
248 | name: shelf_packages_handler
249 | url: "https://pub.dartlang.org"
250 | source: hosted
251 | version: "1.0.4"
252 | shelf_static:
253 | dependency: transitive
254 | description:
255 | name: shelf_static
256 | url: "https://pub.dartlang.org"
257 | source: hosted
258 | version: "0.2.8"
259 | shelf_web_socket:
260 | dependency: transitive
261 | description:
262 | name: shelf_web_socket
263 | url: "https://pub.dartlang.org"
264 | source: hosted
265 | version: "0.2.2+4"
266 | sky_engine:
267 | dependency: transitive
268 | description: flutter
269 | source: sdk
270 | version: "0.0.99"
271 | source_map_stack_trace:
272 | dependency: transitive
273 | description:
274 | name: source_map_stack_trace
275 | url: "https://pub.dartlang.org"
276 | source: hosted
277 | version: "1.1.5"
278 | source_maps:
279 | dependency: transitive
280 | description:
281 | name: source_maps
282 | url: "https://pub.dartlang.org"
283 | source: hosted
284 | version: "0.10.7"
285 | source_span:
286 | dependency: transitive
287 | description:
288 | name: source_span
289 | url: "https://pub.dartlang.org"
290 | source: hosted
291 | version: "1.4.1"
292 | stack_trace:
293 | dependency: transitive
294 | description:
295 | name: stack_trace
296 | url: "https://pub.dartlang.org"
297 | source: hosted
298 | version: "1.9.3"
299 | stream_channel:
300 | dependency: transitive
301 | description:
302 | name: stream_channel
303 | url: "https://pub.dartlang.org"
304 | source: hosted
305 | version: "1.6.8"
306 | string_scanner:
307 | dependency: transitive
308 | description:
309 | name: string_scanner
310 | url: "https://pub.dartlang.org"
311 | source: hosted
312 | version: "1.0.4"
313 | term_glyph:
314 | dependency: transitive
315 | description:
316 | name: term_glyph
317 | url: "https://pub.dartlang.org"
318 | source: hosted
319 | version: "1.0.1"
320 | test:
321 | dependency: transitive
322 | description:
323 | name: test
324 | url: "https://pub.dartlang.org"
325 | source: hosted
326 | version: "1.3.0"
327 | typed_data:
328 | dependency: transitive
329 | description:
330 | name: typed_data
331 | url: "https://pub.dartlang.org"
332 | source: hosted
333 | version: "1.1.6"
334 | utf:
335 | dependency: transitive
336 | description:
337 | name: utf
338 | url: "https://pub.dartlang.org"
339 | source: hosted
340 | version: "0.9.0+5"
341 | vector_math:
342 | dependency: transitive
343 | description:
344 | name: vector_math
345 | url: "https://pub.dartlang.org"
346 | source: hosted
347 | version: "2.0.8"
348 | vm_service_client:
349 | dependency: transitive
350 | description:
351 | name: vm_service_client
352 | url: "https://pub.dartlang.org"
353 | source: hosted
354 | version: "0.2.6"
355 | watcher:
356 | dependency: transitive
357 | description:
358 | name: watcher
359 | url: "https://pub.dartlang.org"
360 | source: hosted
361 | version: "0.9.7+10"
362 | web_socket_channel:
363 | dependency: transitive
364 | description:
365 | name: web_socket_channel
366 | url: "https://pub.dartlang.org"
367 | source: hosted
368 | version: "1.0.9"
369 | yaml:
370 | dependency: transitive
371 | description:
372 | name: yaml
373 | url: "https://pub.dartlang.org"
374 | source: hosted
375 | version: "2.1.15"
376 | sdks:
377 | dart: ">=2.0.0-dev.68.0 <3.0.0"
378 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: banner
2 | description: flutter 的轮播图控件
3 | version: 0.1.0
4 | author: 张瑞宇 <157418979@qq.com>
5 | homepage: https://github.com/zhangruiyu/BannerView
6 |
7 | environment:
8 | sdk: ">=2.0.0-dev.68.0 <3.0.0"
9 |
10 |
11 | dependencies:
12 | flutter:
13 | sdk: flutter
14 |
15 | dev_dependencies:
16 | flutter_test:
17 | sdk: flutter
18 |
19 | # For information on the generic Dart part of this file, see the
20 | # following page: https://www.dartlang.org/tools/pub/pubspec
21 |
22 | # The following section is specific to Flutter.
23 | flutter:
24 |
25 | # To add assets to your package, add an assets section, like this:
26 | # assets:
27 | # - images/a_dot_burr.jpeg
28 | # - images/a_dot_ham.jpeg
29 | #
30 | # For details regarding assets in packages, see
31 | # https://flutter.io/assets-and-images/#from-packages
32 | #
33 | # An image asset can refer to one or more resolution-specific "variants", see
34 | # https://flutter.io/assets-and-images/#resolution-aware.
35 |
36 | # To add custom fonts to your package, add a fonts section here,
37 | # in this "flutter" section. Each entry in this list should have a
38 | # "family" key with the font family name, and a "fonts" key with a
39 | # list giving the asset and other descriptors for the font. For
40 | # example:
41 | # fonts:
42 | # - family: Schyler
43 | # fonts:
44 | # - asset: fonts/Schyler-Regular.ttf
45 | # - asset: fonts/Schyler-Italic.ttf
46 | # style: italic
47 | # - family: Trajan Pro
48 | # fonts:
49 | # - asset: fonts/TrajanPro.ttf
50 | # - asset: fonts/TrajanPro_Bold.ttf
51 | # weight: 700
52 | #
53 | # For details regarding fonts in packages, see
54 | # https://flutter.io/custom-fonts/#from-packages
--------------------------------------------------------------------------------
/test/banner_test.dart:
--------------------------------------------------------------------------------
1 | import 'package:test/test.dart';
2 |
3 | import 'package:banner/banner.dart';
4 |
5 | void main() {
6 | test('adds one to input values', () {
7 | // final calculator = new Calculator();
8 | // expect(calculator.addOne(2), 3);
9 | // expect(calculator.addOne(-7), -6);
10 | // expect(calculator.addOne(0), 1);
11 | // expect(() => calculator.addOne(null), throwsNoSuchMethodError);
12 | });
13 | }
14 |
--------------------------------------------------------------------------------