95 lines
3.1 KiB
Dart
95 lines
3.1 KiB
Dart
// lib/app/widgets/banner_slider.dart
|
|
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:carousel_slider/carousel_slider.dart';
|
|
|
|
class BannerSlider extends StatelessWidget {
|
|
final List<String> bannerImages;
|
|
final RxInt currentCarouselIndex;
|
|
final Function(int) onPageChanged;
|
|
|
|
const BannerSlider({
|
|
super.key,
|
|
required this.bannerImages,
|
|
required this.currentCarouselIndex,
|
|
required this.onPageChanged,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Column(
|
|
children: [
|
|
CarouselSlider(
|
|
options: CarouselOptions(
|
|
height: 180,
|
|
autoPlay: true,
|
|
autoPlayInterval: const Duration(seconds: 5),
|
|
enlargeCenterPage: true,
|
|
viewportFraction: 0.9,
|
|
onPageChanged: (index, reason) {
|
|
onPageChanged(index);
|
|
},
|
|
),
|
|
items: bannerImages.map((imagePath) {
|
|
return Builder(
|
|
builder: (BuildContext context) {
|
|
return Container(
|
|
width: MediaQuery.of(context).size.width,
|
|
margin: const EdgeInsets.symmetric(horizontal: 5.0),
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(15),
|
|
),
|
|
child: ClipRRect(
|
|
borderRadius: BorderRadius.circular(15),
|
|
child: Image.asset(
|
|
imagePath,
|
|
fit: BoxFit.cover,
|
|
errorBuilder: (context, error, stackTrace) {
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
gradient: const LinearGradient(
|
|
colors: [Color(0xFF00B8D4), Color(0xFF0091EA)],
|
|
),
|
|
borderRadius: BorderRadius.circular(15),
|
|
),
|
|
child: const Center(
|
|
child: Icon(
|
|
Icons.image_not_supported,
|
|
color: Colors.white,
|
|
size: 50,
|
|
),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}).toList(),
|
|
),
|
|
const SizedBox(height: 10),
|
|
// Dots Indicator
|
|
Obx(
|
|
() => Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: List.generate(
|
|
bannerImages.length,
|
|
(index) => Container(
|
|
width: 8,
|
|
height: 8,
|
|
margin: const EdgeInsets.symmetric(horizontal: 4),
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.circle,
|
|
color: currentCarouselIndex.value == index
|
|
? const Color(0xFF0091EA)
|
|
: Colors.grey[300],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
} |