Untitled
unknown
plain_text
2 years ago
6.7 kB
7
Indexable
///deal slide looping text advertisement widget
class DealList extends StatefulWidget {
@override
_DealListState createState() => _DealListState();
}
class AdvText {
final String? textAdv;
final List<String?> images;
AdvText({this.textAdv, required this.images});
}
class _DealListState extends State<DealList> {
List<AdvText> dealsWithImages = [
AdvText(textAdv: 'Deal 1: 50% off on Electronics', images: []),
AdvText(
textAdv:
'Deal 2: Buy one get one free on Clothing Buy one get one free on Clothing',
images: [
'http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/nebula_brown.png',
]),
AdvText(textAdv: 'Deal 3: Special discounts on Home Decor', images: [
'http://codeskulptor-demos.commondatastorage.googleapis.com/pang/HfReHl5.jpg',
'http://commondatastorage.googleapis.com/codeskulptor-demos/riceracer_assets/img/tree_4.png'
]),
AdvText(textAdv: '40 people just booked in the last 24 hours', images: [
'http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back05.jpg',
'http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back07.jpg',
'http://codeskulptor-demos.commondatastorage.googleapis.com/GalaxyInvaders/back05.jpg',
]),
AdvText(textAdv: 'Deal 3: 1000% off on Electronics', images: []),
AdvText(
textAdv:
'Deal 2: Buy one get one free on Clothing Buy one get one free on Clothing',
images: [
'http://commondatastorage.googleapis.com/codeskulptor-assets/lathrop/nebula_brown.png',
]),
];
int currentIndex = 0; // Start with the first item
late PageController _pageController;
late Timer _timer;
@override
void initState() {
super.initState();
_pageController = PageController(
viewportFraction: 0.9,
initialPage: 0,
);
_timer = Timer.periodic(Duration(seconds: 1), (timer) {
_pageController.nextPage(
duration: Duration(milliseconds: 500),
curve: Curves.easeInOut,
);
});
}
@override
Widget build(BuildContext context) {
return SizedBox(
height: 42.h,
child: PageView.builder(
controller: _pageController,
scrollDirection: Axis.vertical,
itemBuilder: (context, index) {
final adjustedIndex = index % dealsWithImages.length;
return Stack(
alignment: AlignmentDirectional.centerStart,
clipBehavior: Clip.hardEdge,
children: [
Visibility(
visible: dealsWithImages[adjustedIndex].images.isNotEmpty,
child: Container(
height: 32,
width: 32,
margin: EdgeInsets.only(left: 8),
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: BaseColors.white, width: 1)),
child: CircleAvatar(
radius: 30.0,
backgroundColor: BaseColors.white,
backgroundImage: dealsWithImages[adjustedIndex]
.images
.isNotEmpty
? dealsWithImages[adjustedIndex].images[0]?.toNetwork
: null),
),
),
Visibility(
visible: dealsWithImages[adjustedIndex].images.length >= 2,
child: Positioned(
left: 28.0,
child: Container(
height: 32,
width: 32,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: BaseColors.white, width: 1)),
child: CircleAvatar(
radius: 30.0,
backgroundColor: BaseColors.white,
backgroundImage:
dealsWithImages[adjustedIndex].images.length >= 2
? dealsWithImages[adjustedIndex]
.images[1]
?.toNetwork
: null,
),
),
),
),
Visibility(
visible: dealsWithImages[adjustedIndex].images.length >= 3,
child: Positioned(
left: 48.0,
child: Container(
height: 32,
width: 32,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: BaseColors.white, width: 1)),
child: CircleAvatar(
radius: 30.0,
backgroundColor: BaseColors.white,
backgroundImage:
dealsWithImages[adjustedIndex].images.length >= 3
? dealsWithImages[adjustedIndex]
.images[2]
?.toNetwork
: null,
),
),
),
),
Positioned(
left: dealsWithImages[adjustedIndex].images.isEmpty
? 8.0
: dealsWithImages[adjustedIndex].images.length == 1
? dealsWithImages[adjustedIndex].images.length * 50
: dealsWithImages[adjustedIndex].images.length == 2
? dealsWithImages[adjustedIndex].images.length *
35
: dealsWithImages[adjustedIndex].images.length *
30,
child: Container(
width: MediaQuery.of(context).size.width * 0.85,
child: Text(
dealsWithImages[adjustedIndex].textAdv ?? '',
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.white,
fontSize: 13,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
))
],
);
},
),
);
}
@override
void dispose() {
_timer.cancel();
_pageController.dispose();
super.dispose();
}
}Editor is loading...
Leave a Comment