| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- import 'package:flutter/cupertino.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_screenutil/flutter_screenutil.dart';
- import 'package:location/resource/colors.gen.dart';
- import 'package:location/utils/common_expand.dart';
- import 'package:smooth_page_indicator/smooth_page_indicator.dart';
- class InfiniteScrollController extends PageController {
- final int itemCount;
- InfiniteScrollController({
- required this.itemCount,
- int initialPage = 0,
- super.viewportFraction,
- }) : super(
- initialPage: initialPage * 1000,
- );
- int getRealIndex(int page) {
- if (itemCount == 0) return 0;
- return page % itemCount;
- }
- }
- class MemberActivityBannerWidget extends StatefulWidget {
- final int itemCount;
- final IndexedWidgetBuilder itemBuilder;
- final double bannerHeight;
- final double viewportFraction;
- const MemberActivityBannerWidget({
- super.key,
- required this.itemCount,
- required this.itemBuilder,
- this.bannerHeight = 100.0,
- this.viewportFraction = 1,
- });
- @override
- _MemberActivityBannerWidgetState createState() =>
- _MemberActivityBannerWidgetState();
- }
- class _MemberActivityBannerWidgetState
- extends State<MemberActivityBannerWidget> {
- late InfiniteScrollController _controller;
- @override
- void initState() {
- super.initState();
- _controller = InfiniteScrollController(
- initialPage: widget.itemCount * 500,
- itemCount: widget.itemCount,
- viewportFraction: widget.viewportFraction);
- _startAutoPlay();
- }
- void _startAutoPlay() {
- Future.delayed(const Duration(seconds: 5), () {
- if (_controller.hasClients) {
- _controller.nextPage(
- duration: const Duration(milliseconds: 500),
- curve: Curves.ease,
- );
- _startAutoPlay();
- }
- });
- }
- @override
- void dispose() {
- _controller.dispose();
- super.dispose();
- }
- @override
- Widget build(BuildContext context) {
- return IntrinsicHeight(
- child: Column(
- children: [
- SizedBox(
- height: widget.bannerHeight,
- child: PageView.builder(
- controller: _controller,
- itemBuilder: (context, index) {
- final realIndex = _controller.getRealIndex(index);
- return widget.itemBuilder(context, realIndex);
- },
- ),
- ),
- Container(
- alignment: Alignment.center,
- padding: EdgeInsets.only(top: 16.w),
- child: SmoothPageIndicator(
- controller: _controller,
- count: widget.itemCount,
- effect: ExpandingDotsEffect(
- expansionFactor: 2,
- dotWidth: 5.0,
- dotHeight: 5.w,
- spacing: 4.0,
- dotColor: '#D7D7E8'.color,
- activeDotColor: ColorName.colorPrimary,
- ),
- onDotClicked: (index) {
- _controller.animateToPage(
- index + _controller.initialPage,
- duration: const Duration(milliseconds: 500),
- curve: Curves.ease,
- );
- },
- ),
- ),
- ],
- ),
- );
- }
- }
|