1
+ import 'package:carousel_slider/carousel_slider.dart' ;
2
+ import 'package:flutter/material.dart' ;
3
+
4
+ class ProductCard extends StatefulWidget {
5
+ const ProductCard ({ Key ? key }) : super (key: key);
6
+
7
+ @override
8
+ _ProductCardState createState () => _ProductCardState ();
9
+ }
10
+
11
+ class _ProductCardState extends State <ProductCard > {
12
+ int _current = 0 ;
13
+ dynamic _selectedIndex = {};
14
+
15
+ CarouselController _carouselController = new CarouselController ();
16
+
17
+ List <dynamic > _products = [
18
+ {
19
+ 'title' : 'Adidas Originals \n by Alexander Wang' ,
20
+ 'image' : 'https://images.unsplash.com/photo-1606107557195-0e29a4b5b4aa?ixid=MnwxMjA3fDB8MHxzZWFyY2h8MzV8fGFkaWRhc3xlbnwwfHwwfHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=400&q=60' ,
21
+ 'description' : 'Limited collection'
22
+ },
23
+ {
24
+ 'title' : 'Adidas Originals \n by Alexander Wang' ,
25
+ 'image' : 'https://images.unsplash.com/photo-1582588678413-dbf45f4823e9?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2265&q=80' ,
26
+ 'description' : 'Limited collection'
27
+ },
28
+ {
29
+ 'title' : 'Adidas Originals \n by Alexander Wang' ,
30
+ 'image' : 'https://images.unsplash.com/photo-1589188056053-28910dc61d38?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2264&q=80' ,
31
+ 'description' : 'Limited collection'
32
+ }
33
+ ];
34
+
35
+ @override
36
+ Widget build (BuildContext context) {
37
+ return Scaffold (
38
+ floatingActionButton: _selectedIndex.length > 0 ? FloatingActionButton (
39
+ onPressed: () {},
40
+ child: Icon (Icons .arrow_forward_ios),
41
+ ) : null ,
42
+ appBar: AppBar (
43
+ elevation: 0 ,
44
+ backgroundColor: Colors .transparent,
45
+ title: Text ('@theflutterlover' , style: TextStyle (
46
+ color: Colors .black,
47
+ ),),
48
+ ),
49
+ body: Container (
50
+ width: double .infinity,
51
+ height: double .infinity,
52
+ child: CarouselSlider (
53
+ carouselController: _carouselController,
54
+ options: CarouselOptions (
55
+ height: 450.0 ,
56
+ aspectRatio: 16 / 9 ,
57
+ viewportFraction: 0.70 ,
58
+ enlargeCenterPage: true ,
59
+ pageSnapping: true ,
60
+ onPageChanged: (index, reason) {
61
+ setState (() {
<
8000
/code>
62
+ _current = index;
63
+ });
64
+ }
65
+ ),
66
+ items: _products.map ((movie) {
67
+ return Builder (
68
+ builder: (BuildContext context) {
69
+ return GestureDetector (
70
+ onTap: () {
71
+ setState (() {
72
+ if (_selectedIndex == movie) {
73
+ _selectedIndex = {};
74
+ } else {
75
+ _selectedIndex = movie;
76
+ }
77
+ });
78
+ },
79
+ child: AnimatedContainer (
80
+ duration: Duration (milliseconds: 300 ),
81
+ width: MediaQuery .of (context).size.width,
82
+ decoration: BoxDecoration (
83
+ color: Colors .white,
84
+ borderRadius: BorderRadius .circular (20 ),
85
+ border: _selectedIndex == movie ? Border .all (color: Colors .blue.shade500, width: 3 ) : null ,
86
+ boxShadow: _selectedIndex == movie ? [
87
+ BoxShadow (
88
+ color: Colors .blue.shade100,
89
+ blurRadius: 30 ,
90
+ offset: Offset (0 , 10 )
91
+ )
92
+ ] : [
93
+ BoxShadow (
94
+ color: Colors .grey.withOpacity (0.2 ),
95
+ blurRadius: 20 ,
96
+ offset: Offset (0 , 5 )
97
+ )
98
+ ]
99
+ ),
100
+ child: SingleChildScrollView (
101
+ child: Column (
102
+ children: [
103
+ Container (
104
+ height: 320 ,
105
+ margin: EdgeInsets .only (top: 10 ),
106
+ clipBehavior: Clip .hardEdge,
107
+ decoration: BoxDecoration (
108
+ borderRadius: BorderRadius .circular (20 ),
109
+ ),
110
+ child: Image .network (movie['image' ], fit: BoxFit .cover),
111
+ ),
112
+ SizedBox (height: 20 ,),
113
+ Text (movie['title' ], style: TextStyle (
114
+ fontSize: 16 ,
115
+ fontWeight: FontWeight .bold
116
+ ),),
117
+ SizedBox (height: 20 ,),
118
+ Text (movie['description' ], style: TextStyle (
119
+ fontSize: 14 ,
120
+ color: Colors .grey.shade600
121
+ ),),
122
+ ],
123
+ ),
124
+ ),
125
+ ),
126
+ );
127
+ },
128
+ );
129
+ }).toList ()
130
+ ),
131
+ ),
132
+ );
133
+ }
134
+ }
0 commit comments