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:location/resource/colors.gen.dart';
  7. import 'package:smooth_page_indicator/smooth_page_indicator.dart';
  8. // 无限滚动控制器
  9. class InfiniteScrollController extends PageController {
  10. final int itemCount;
  11. InfiniteScrollController({
  12. required this.itemCount,
  13. int initialPage = 0,
  14. }) : super(initialPage: initialPage * 1000); // 从一个很大的中间值开始
  15. int getRealIndex(int page) {
  16. if (itemCount == 0) return 0;
  17. return page % itemCount;
  18. }
  19. }
  20. class MemberHeaderCycleWidget extends StatefulWidget {
  21. @override
  22. _MemberHeaderCycleWidgetState createState() => _MemberHeaderCycleWidgetState();
  23. }
  24. class _MemberHeaderCycleWidgetState extends State<MemberHeaderCycleWidget> {
  25. late InfiniteScrollController _controller;
  26. final List<ImageProvider> _images = [
  27. Assets.images.imgMemberHeaderAd1.provider(),
  28. Assets.images.imgMemberHeaderAd2.provider(),
  29. Assets.images.imgMemberHeaderAd3.provider(),
  30. Assets.images.imgMemberHeaderAd4.provider(),
  31. ];
  32. @override
  33. void initState() {
  34. super.initState();
  35. _controller = InfiniteScrollController(itemCount: _images.length);
  36. _startAutoPlay();
  37. }
  38. void _startAutoPlay() {
  39. Future.delayed(Duration(seconds: 5), () {
  40. if (_controller.hasClients) {
  41. _controller.nextPage(
  42. duration: Duration(milliseconds: 500),
  43. curve: Curves.ease,
  44. );
  45. _startAutoPlay();
  46. }
  47. });
  48. }
  49. @override
  50. void dispose() {
  51. _controller.dispose();
  52. super.dispose();
  53. }
  54. @override
  55. Widget build(BuildContext context) {
  56. return Stack(
  57. children: [
  58. Container(
  59. height: 291.w + MediaQuery.of(Get.context!).padding.top - 36.5.w,
  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.cover,
  71. )
  72. ),
  73. );
  74. },
  75. ),
  76. ),
  77. Positioned(
  78. bottom: 38.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.shade400,
  93. activeDotColor: ColorName.colorPrimary,
  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. }