member_header_cycle_widget.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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: 5), () {
  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. height: 291.w + MediaQuery.of(Get.context!).padding.top - 36.5.w,
  59. width: double.infinity,
  60. child: PageView.builder(
  61. controller: _controller,
  62. itemCount: null, // 无限滚动
  63. itemBuilder: (context, index) {
  64. final realIndex = _controller.getRealIndex(index);
  65. return Container(
  66. decoration: BoxDecoration(
  67. image: DecorationImage(
  68. image: _images[realIndex],
  69. //fit: BoxFit.cover,
  70. )
  71. ),
  72. );
  73. },
  74. ),
  75. ),
  76. Positioned(
  77. bottom: 38.w,
  78. left: 0,
  79. right: 0,
  80. height: 5.w,
  81. child: Container(
  82. alignment: Alignment.center,
  83. child: SmoothPageIndicator(
  84. controller: _controller,
  85. count: _images.length,
  86. effect: ExpandingDotsEffect(
  87. expansionFactor: 2,
  88. dotWidth: 5.0,
  89. dotHeight: 5.w,
  90. spacing: 4.0,
  91. dotColor: Colors.grey,
  92. activeDotColor: Colors.deepPurple,
  93. ),
  94. onDotClicked: (index) {
  95. _controller.animateToPage(
  96. index + _controller.initialPage, // 跳转到对应的位置
  97. duration: Duration(milliseconds: 500),
  98. curve: Curves.ease,
  99. );
  100. },
  101. ),
  102. )),
  103. ],
  104. );
  105. }
  106. }