member_activity_banner_widget.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:location/resource/colors.gen.dart';
  5. import 'package:location/utils/common_expand.dart';
  6. import 'package:smooth_page_indicator/smooth_page_indicator.dart';
  7. class InfiniteScrollController extends PageController {
  8. final int itemCount;
  9. InfiniteScrollController({
  10. required this.itemCount,
  11. int initialPage = 0,
  12. super.viewportFraction,
  13. }) : super(
  14. initialPage: initialPage * 1000,
  15. );
  16. int getRealIndex(int page) {
  17. if (itemCount == 0) return 0;
  18. return page % itemCount;
  19. }
  20. }
  21. class MemberActivityBannerWidget extends StatefulWidget {
  22. final int itemCount;
  23. final IndexedWidgetBuilder itemBuilder;
  24. final double bannerHeight;
  25. final double viewportFraction;
  26. const MemberActivityBannerWidget({
  27. super.key,
  28. required this.itemCount,
  29. required this.itemBuilder,
  30. this.bannerHeight = 100.0,
  31. this.viewportFraction = 1,
  32. });
  33. @override
  34. _MemberActivityBannerWidgetState createState() =>
  35. _MemberActivityBannerWidgetState();
  36. }
  37. class _MemberActivityBannerWidgetState
  38. extends State<MemberActivityBannerWidget> {
  39. late InfiniteScrollController _controller;
  40. @override
  41. void initState() {
  42. super.initState();
  43. _controller = InfiniteScrollController(
  44. initialPage: widget.itemCount * 500,
  45. itemCount: widget.itemCount,
  46. viewportFraction: widget.viewportFraction);
  47. _startAutoPlay();
  48. }
  49. void _startAutoPlay() {
  50. Future.delayed(const Duration(seconds: 5), () {
  51. if (_controller.hasClients) {
  52. _controller.nextPage(
  53. duration: const Duration(milliseconds: 500),
  54. curve: Curves.ease,
  55. );
  56. _startAutoPlay();
  57. }
  58. });
  59. }
  60. @override
  61. void dispose() {
  62. _controller.dispose();
  63. super.dispose();
  64. }
  65. @override
  66. Widget build(BuildContext context) {
  67. return IntrinsicHeight(
  68. child: Column(
  69. children: [
  70. SizedBox(
  71. height: widget.bannerHeight,
  72. child: PageView.builder(
  73. controller: _controller,
  74. itemBuilder: (context, index) {
  75. final realIndex = _controller.getRealIndex(index);
  76. return widget.itemBuilder(context, realIndex);
  77. },
  78. ),
  79. ),
  80. Container(
  81. alignment: Alignment.center,
  82. padding: EdgeInsets.only(top: 16.w),
  83. child: SmoothPageIndicator(
  84. controller: _controller,
  85. count: widget.itemCount,
  86. effect: ExpandingDotsEffect(
  87. expansionFactor: 2,
  88. dotWidth: 5.0,
  89. dotHeight: 5.w,
  90. spacing: 4.0,
  91. dotColor: '#D7D7E8'.color,
  92. activeDotColor: ColorName.colorPrimary,
  93. ),
  94. onDotClicked: (index) {
  95. _controller.animateToPage(
  96. index + _controller.initialPage,
  97. duration: const Duration(milliseconds: 500),
  98. curve: Curves.ease,
  99. );
  100. },
  101. ),
  102. ),
  103. ],
  104. ),
  105. );
  106. }
  107. }