A versatile, feature-rich carousel implementation for Flutter based on Material Design 3 principles. This package offers multiple carousel layouts, auto-play functionality, custom indicators, and complete controller capabilities.
If you find my work valuable, your support means the world to me! It helps me focus on creating more, learning, and growing. Thank you for your generosity and support! ☕
- Support My Work
- Features
- Supported Platforms
- Installation
- Quick Start
- Usage
- Indicator Styles
- Layout Models
- Customization
- Contributing
- License
- Activities
- 📱 Multiple Layouts: Supports uncontained, hero, multi-browse, and full-screen layout models as defined in Material Design 3
- 🎮 Full Controller: Navigate programmatically between slides with animations
- 🔄 Auto Play: Built-in autoplay with customizable intervals and pause-on-interaction
- 🔵 Beautiful Indicators: 5 different indicator styles with full customization options
- 📏 Dynamic Sizing: Weighted layouts for diverse item sizes and transitions
↕️ Axis Support: Both horizontal and vertical scrolling- 🌐 Web Optimized: Enhanced mouse wheel and drag interaction for web platforms
- Flutter Android
- Flutter iOS
- Flutter web
- Flutter desktop
- Flutter macOS
- Flutter Linux
Add to your pubspec.yaml
:
dependencies:
flutter_custom_caraousel_v2: ^1.0.0
import 'package:flutter_custom_caraousel_v2/flutter_custom_caraousel_v2.dart';
// Basic carousel
CarouselViewV2(
itemExtent: 300,
autoPlay: true,
indicator: CarouselIndicator(
styleIndicator: StyleIndicator.dotIndicator,
count: 3,
currentIndex: 0,
),
children: [
Container(color: Colors.red, child: Center(child: Text('Slide 1'))),
Container(color: Colors.blue, child: Center(child: Text('Slide 2'))),
Container(color: Colors.green, child: Center(child: Text('Slide 3'))),
],
)
Create a basic carousel with fixed-size items:
CarouselViewV2(
itemExtent: 300,
onTap: (index) => print('Tapped on item $index'),
children: yourItemsList,
)
Create a carousel with items of varying sizes:
CarouselViewV2.weighted(
flexWeights: [1, 3, 1], // Middle item is 3x larger
children: yourItemsList,
)
Add indicators to show the current position:
CarouselViewV2(
itemExtent: 300,
indicator: CarouselIndicator(
styleIndicator: StyleIndicator.dotIndicator,
count: yourItemsList.length,
currentIndex: 0, // Initial position
activeColor: Colors.blue,
inactiveColor: Colors.grey.withOpacity(0.5),
),
children: yourItemsList,
)
Enable auto-sliding functionality with pause on user interaction:
CarouselViewV2(
itemExtent: 300,
autoPlay: true,
autoPlayInterval: const Duration(seconds: 3),
children: yourItemsList,
)
Control the carousel programmatically:
// Create a controller
final carouselController = CarouselControllerv2(initialItem: 0);
// Use it with your carousel
CarouselViewV2(
itemExtent: 300,
controller: carouselController,
children: yourItemsList,
)
// Later, navigate to a specific item
carouselController.animateToItem(
2,
duration: Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
// Or jump instantly
carouselController.jumpToItem(3);
// Get the current item
int? currentIndex = carouselController.currentItem;
Enable optimized handling for web platforms:
CarouselViewV2(
itemExtent: 300,
isWeb: true, // Enables enhanced mouse wheel and drag interaction
children: yourItemsList,
)
Choose from 5 beautiful indicator styles:
-
Dot Indicator (
StyleIndicator.dotIndicator
)- Standard circular dots
- Active dot can be larger than inactive dots
-
Bar Indicator (
StyleIndicator.barIndicator
)- Horizontal bars with customizable width
- Active bar can be wider than inactive bars
-
Circular Indicator (
StyleIndicator.circularIndicator
)- Circular indicators with border emphasis
- Active indicator has a distinctive border
-
Sequential Fill Indicator (
StyleIndicator.sequentialFillIndicator
)- Dots that fill up sequentially to the current position
- All dots up to and including current position are active
-
Expanding Dot Indicator (
StyleIndicator.expandingDotIndicator
)- Dots that expand horizontally for the active item
- Active dot stretches to a pill shape
This carousel supports all Material Design 3 carousel layouts:
Items scroll to the edge of the container, similar to a standard ListView:
CarouselViewV2(
itemExtent: 300,
children: yourItemsList,
)
Shows at least one large and one small item at a time:
CarouselViewV2.weighted(
flexWeights: [1, 5, 1],
children: yourItemsList,
)
Shows items of various sizes simultaneously:
CarouselViewV2.weighted(
flexWeights: [1, 3, 2],
children: yourItemsList,
)
Shows one edge-to-edge large item at a time:
// Horizontal full-screen
CarouselViewV2(
itemExtent: MediaQuery.of(context).size.width,
children: yourItemsList,
)
// Or with weighted layout
CarouselViewV2.weighted(
flexWeights: [1], // Only one visible item
children: yourItemsList,
)
// Vertical full-screen
CarouselViewV2(
scrollDirection: Axis.vertical,
itemExtent: MediaQuery.of(context).size.height,
children: yourItemsList,
)
Property | Type | Description |
---|---|---|
itemExtent |
double |
Size of each item (for standard layout) |
flexWeights |
List<int> |
Weight distribution for weighted layout |
padding |
EdgeInsets |
Padding around each item |
backgroundColor |
Color |
Background color for each item |
elevation |
double |
Z-coordinate of each item |
shape |
ShapeBorder |
Shape of each item's Material |
overlayColor |
WidgetStateProperty<Color?> |
Color for pressed/hovered/focused states |
autoPlay |
bool |
Whether to auto-advance slides |
autoPlayInterval |
Duration |
Time between auto-advances |
indicator |
CarouselIndicator |
Custom indicator widget |
scrollDirection |
Axis |
Horizontal or vertical scrolling |
onTap |
ValueChanged<int> |
Callback when an item is tapped |
enableSplash |
bool |
Whether to show ink splash effect |
shrinkExtent |
double |
Minimum size during scrolling transitions |
itemSnapping |
bool |
Whether items snap into position |
reverse |
bool |
Whether to scroll in the reverse direction |
isWeb |
bool |
Enable web-specific mouse wheel/drag optimization |
consumeMaxWeight |
bool |
Whether collapsed items can expand to max size |
Property | Type | Description |
---|---|---|
styleIndicator |
StyleIndicator |
Type of indicator to display |
count |
int |
Total number of items |
currentIndex |
int |
Current active item index |
activeColor |
Color |
Color for active indicator |
inactiveColor |
Color |
Color for inactive indicators |
enableAnimation |
bool |
Whether to animate state changes |
size |
double |
Base size for indicators |
spacing |
double |
Spacing between indicators |
activeSize |
double |
Size for active dot indicator |
width |
double |
Width for bar indicator |
height |
double |
Height for bar indicator |
activeWidth |
double |
Width of active bar indicator |
borderRadius |
BorderRadius |
Border radius for bar indicator |
borderWidth |
double |
Border width for circular indicator |
dotHeight |
double |
Height for expanding dot indicator |
dotWidth |
double |
Width for inactive expanding dot |
activeDotWidth |
double |
Width for active expanding dot |
Contributions are welcome! If you find a bug or want a feature, please open an issue.
This package is available under the MIT License. See the LICENSE file for details.