member_header_cycle_widget.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:get/get.dart';
  5. import 'package:location/resource/assets.gen.dart';
  6. import 'package:smooth_page_indicator/smooth_page_indicator.dart';
  7. // 无限滚动控制器
  8. class InfiniteScrollController extends PageController {
  9. final int itemCount;
  10. InfiniteScrollController({
  11. required this.itemCount,
  12. int initialPage = 0,
  13. }) : super(initialPage: initialPage * 1000); // 从一个很大的中间值开始
  14. int getRealIndex(int page) {
  15. if (itemCount == 0) return 0;
  16. return page % itemCount;
  17. }
  18. }
  19. class MemberHeaderCycleWidget extends StatefulWidget {
  20. @override
  21. _MemberHeaderCycleWidgetState createState() => _MemberHeaderCycleWidgetState();
  22. }
  23. class _MemberHeaderCycleWidgetState extends State<MemberHeaderCycleWidget> {
  24. late InfiniteScrollController _controller;
  25. final List<ImageProvider> _images = [
  26. Assets.images.imgMemberHeaderAd1.provider(),
  27. Assets.images.imgMemberHeaderAd2.provider(),
  28. Assets.images.imgMemberHeaderAd3.provider(),
  29. Assets.images.imgMemberHeaderAd4.provider(),
  30. ];
  31. @override
  32. void initState() {
  33. super.initState();
  34. _controller = InfiniteScrollController(itemCount: _images.length);
  35. _startAutoPlay();
  36. }
  37. void _startAutoPlay() {
  38. Future.delayed(Duration(seconds: 3), () {
  39. if (_controller.hasClients) {
  40. _controller.nextPage(
  41. duration: Duration(milliseconds: 500),
  42. curve: Curves.ease,
  43. );
  44. _startAutoPlay();
  45. }
  46. });
  47. }
  48. @override
  49. void dispose() {
  50. _controller.dispose();
  51. super.dispose();
  52. }
  53. @override
  54. Widget build(BuildContext context) {
  55. return Stack(
  56. children: [
  57. Container(
  58. color: Colors.orangeAccent,
  59. height: 291.w + MediaQuery.of(Get.context!).padding.top,
  60. width: double.infinity,
  61. child: PageView.builder(
  62. controller: _controller,
  63. itemCount: null, // 无限滚动
  64. itemBuilder: (context, index) {
  65. final realIndex = _controller.getRealIndex(index);
  66. return Container(
  67. decoration: BoxDecoration(
  68. image: DecorationImage(
  69. image: _images[realIndex],
  70. fit: BoxFit.fill,
  71. )
  72. ),
  73. );
  74. },
  75. ),
  76. ),
  77. Positioned(
  78. bottom: 50.w,
  79. left: 0,
  80. right: 0,
  81. height: 5.w,
  82. child: Container(
  83. alignment: Alignment.center,
  84. child: SmoothPageIndicator(
  85. controller: _controller,
  86. count: _images.length,
  87. effect: ExpandingDotsEffect(
  88. expansionFactor: 2,
  89. dotWidth: 5.0,
  90. dotHeight: 5.w,
  91. spacing: 4.0,
  92. dotColor: Colors.grey,
  93. activeDotColor: Colors.deepPurple,
  94. ),
  95. onDotClicked: (index) {
  96. _controller.animateToPage(
  97. index + _controller.initialPage, // 跳转到对应的位置
  98. duration: Duration(milliseconds: 500),
  99. curve: Curves.ease,
  100. );
  101. },
  102. ),
  103. )),
  104. ],
  105. );
  106. }
  107. }