-
Notifications
You must be signed in to change notification settings - Fork 23
/
sliding_tutorial.dart
84 lines (74 loc) · 2.26 KB
/
sliding_tutorial.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
import 'package:example_flutter_sliding_tutorial/page/e_commerce_page.dart';
import 'package:example_flutter_sliding_tutorial/page/web_analytics_page.dart';
import 'package:example_flutter_sliding_tutorial/page/web_developer_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_sliding_tutorial/flutter_sliding_tutorial.dart';
class SlidingTutorial extends StatefulWidget {
const SlidingTutorial({
required this.controller,
required this.notifier,
required this.pageCount,
super.key,
});
final ValueNotifier<double> notifier;
final int pageCount;
final PageController controller;
@override
State<StatefulWidget> createState() => _SlidingTutorial();
}
class _SlidingTutorial extends State<SlidingTutorial> {
late PageController _pageController;
@override
void initState() {
_pageController = widget.controller;
/// Listen to [PageView] position updates.
_pageController.addListener(_onScroll);
super.initState();
}
@override
Widget build(BuildContext context) {
return AnimatedBackgroundColor(
pageController: _pageController,
pageCount: widget.pageCount,
/// You can use your own color list for page background
//ignore: avoid_redundant_argument_values
colors: const [
Color(0xFFAAAAAA),
Color(0xFF669900),
Color(0xFFCC0000),
Color(0xFF0099CC),
Color(0xFFAA66CC),
Color(0xFFFF8800),
],
child: Stack(
children: [
PageView(
controller: _pageController,
children: List<Widget>.generate(
widget.pageCount,
_getPageByIndex,
),
),
],
),
);
}
/// Create different [SlidingPage] for indexes.
Widget _getPageByIndex(int index) {
switch (index % 3) {
case 0:
return WebAnalyticsPage(index, widget.notifier);
case 1:
return WebDevelopersPage(index, widget.notifier);
case 2:
return ECommercePage(index, widget.notifier);
default:
throw ArgumentError('Unknown position: $index');
}
}
/// Notify [SlidingPage] about current page changes.
void _onScroll() {
widget.notifier.value = _pageController.page ?? 0;
}
}