carousel_slider: ^4.2.1
carousel_slider | Flutter Package
直接贴代码
import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; class MyBannerView extends StatefulWidget { final List<int> imgList; //demolist final void Function(int index) select; const MyBannerView(this.imgList, {super.key, required this.select}); @override State<MyBannerView> createState() => _MyBannerViewState(); } class _MyBannerViewState extends State<MyBannerView> { final CarouselController _buttonCarouselController = CarouselController(); int _currentIndex = 0; @override Widget build(BuildContext context) { return Column( children: [ CarouselSlider( options: CarouselOptions( autoPlay: true, viewportFraction: 1.0, onPageChanged: (index, _) { setState(() { _currentIndex = index; }); }), items: widget.imgList.map((i) { return Builder( builder: (BuildContext context) { return GestureDetector( onTap: () { widget.select(_currentIndex); }, child: Container( width: MediaQuery.of(context).size.width - 40, height: 350, margin: const EdgeInsets.all(20), decoration: ShapeDecoration( image: const DecorationImage( image: AssetImage("images/img/demo_banner.png")), shape: RoundedRectangleBorder( borderRadius: BorderRadiusDirectional.circular(8))), ), ); }, ); }).toList(), carouselController: _buttonCarouselController, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: widget.imgList.map((idx) { return GestureDetector( onTap: () => _buttonCarouselController.animateToPage(idx), child: Container( width: 5.56, height: 5.56, margin: const EdgeInsets.symmetric( vertical: 0.0, horizontal: 4.0), color: (idx-1) == _currentIndex ? Colors.blue : Colors.red, ), ); }).toList()) ], ); } }