Aidra Connect 10.0.2+16
Aidra Connect Mobile Application
Loading...
Searching...
No Matches
banner_slider.dart
Go to the documentation of this file.
1import 'dart:async';
2import 'dart:convert';
3
4import '/features/main_menu/domain/entities/banner_entity.dart';
5import 'package:animate_do/animate_do.dart';
6import 'package:flutter/material.dart';
7import 'package:flutter_bloc/flutter_bloc.dart';
8import 'package:flutter_screenutil/flutter_screenutil.dart';
9import 'package:smooth_page_indicator/smooth_page_indicator.dart';
10
11import '../../logic/cubit/banners_cubit.dart';
12
13class BannerSliderView extends StatefulWidget {
14 const BannerSliderView({super.key});
15
16 @override
17 State<BannerSliderView> createState() => _BannerSliderViewState();
18}
19
20class _BannerSliderViewState extends State<BannerSliderView> {
21 final banners = [
23 id: 1,
24 name: '1',
25 image: 'assets/images/banner1.png',
26 ),
28 id: 2,
29 name: '2',
30 image: 'assets/images/banner2.png',
31 ),
33 id: 3,
34 name: '3',
35 image: 'assets/images/banner3.png',
36 ),
37 ];
38 @override
39 Widget build(BuildContext context) {
40 return BannerSlider(banners: banners);
41 return BlocBuilder<BannersCubit, BannersState>(
42 builder: (context, state) {
43 if (state is BannerLoadingSuccessfully) {
44 return state.banners.isEmpty
45 ? SizedBox(height: 20.sp)
46 : BannerSlider(banners: state.banners);
47 } else if (state is BannersLoadingFailure) {
48 return SizedBox(height: 20.sp);
49 } else {
50 return SizedBox(height: 20.sp);
51 }
52 },
53 );
54 }
55}
56
57class BannerSlider extends StatefulWidget {
59 super.key,
60 required this.banners,
61 });
62
63 final List<BannerEntity> banners;
64
65 @override
66 State<BannerSlider> createState() => _BannerSliderState();
67}
68
69class _BannerSliderState extends State<BannerSlider> {
70 final PageController _pageController = PageController(viewportFraction: 1.0);
71
72 int _currentPage = 0;
73
74 @override
75 void initState() {
76 super.initState();
77
78 Future.delayed(const Duration(seconds: 1), () {
79 autoSlide();
80 });
81 }
82
83 void autoSlide() {
84 Timer.periodic(const Duration(seconds: 3), (Timer timer) {
85 if (_currentPage < widget.banners.length - 1) {
87 } else {
88 _currentPage = 0;
89 }
90
91 _pageController.animateToPage(
93 duration: const Duration(milliseconds: 350),
94 curve: Curves.easeIn,
95 );
96 });
97 }
98
99 @override
100 void dispose() {
101 _pageController.dispose();
102 super.dispose();
103 }
104
105 @override
106 Widget build(BuildContext context) {
107 return ZoomIn(
108 child: Column(
109 children: [
110 Container(
111 margin: EdgeInsets.symmetric(vertical: 15.sp),
112 width: MediaQuery.of(context).size.width,
113 height: 140.sp,
114 decoration: BoxDecoration(
115 borderRadius: BorderRadius.circular(10),
116 ),
117 child: Stack(
118 children: [
119 PageView.builder(
120 controller: _pageController,
121 onPageChanged: (index) {
122 setState(() {
123 _currentPage = index;
124 });
125 },
126 itemCount: widget.banners.length,
127 itemBuilder: (context, index) {
128 return Container(
129 decoration: BoxDecoration(
130 color: Theme.of(context)
131 .colorScheme
132 .surface
133 .withOpacity(0.11),
134 borderRadius: BorderRadius.circular(10),
135 ),
136 child: ClipRRect(
137 borderRadius: BorderRadius.circular(10),
138 child: Image.asset(
139 widget.banners[index].image ?? '',
140 // fit: BoxFit.fitHeight,
141 ),
142 // child: Image.memory(
143 // base64Decode(widget.banners[index].image ?? ''),
144 // fit: BoxFit.fill,
145 // ),
146 ),
147 );
148 },
149 ),
150 Positioned(
151 bottom: 10,
152 left: 0,
153 right: 0,
154 child: Center(
155 child: SmoothPageIndicator(
156 controller: _pageController,
157 count: widget.banners.length,
158 effect: WormEffect(
159 dotHeight: 8,
160 dotWidth: 8,
161 spacing: 8,
162 dotColor: Theme.of(context)
163 .colorScheme
164 .onPrimary
165 .withOpacity(0.5),
166 activeDotColor: Theme.of(context).primaryColor,
167 ),
168 ),
169 ),
170 ),
171 ],
172 ),
173 ),
174 ],
175 ),
176 );
177 }
178}
void autoSlide()
class BannerSliderView extends StatefulWidget banners
const BannersLoadingFailure({required this.failure})
final List< BannerEntity > banners
override State< BannerSliderView > createState()
const BannerSlider({ super.key, required this.banners, })
override State< BannerSlider > createState()
const BannerSliderView({super.key})
final String name
override void dispose()
final Widget child
override void initState()
class EnergyScreen extends StatefulWidget _pageController
final Color color
Definition failures.dart:1
override Widget build(BuildContext context)
late int _currentPage