Aidra Connect 10.0.2+16
Aidra Connect Mobile Application
Loading...
Searching...
No Matches
emission_breakdown_list.dart
Go to the documentation of this file.
1import '/core/ui/widgets/custom_card.dart';
2import 'package:flutter/material.dart';
3import 'package:flutter_screenutil/flutter_screenutil.dart';
4import 'package:hugeicons/hugeicons.dart';
5
6class EmissionsBreakdownList extends StatelessWidget {
7 const EmissionsBreakdownList({super.key});
8
9 @override
10 Widget build(BuildContext context) {
11 return CustomCard(
12 padding:
13 EdgeInsets.only(left: 3.sp, right: 17.sp, top: 10.sp, bottom: 15.sp),
15 categories: [
17 name: 'Energy',
18 icon: HugeIcons.strokeRoundedEnergy,
19 percentage: 0.40,
20 backgroundColor: const Color(0xFFFFECEC),
21 iconColor: const Color(0xFFFF6B6B),
22 progressColor: const Color(0xFFFF6B6B),
23 progressBackgroundColor: const Color(0xFFFFECEC),
24 ),
26 name: 'Food',
27 icon: HugeIcons.strokeRoundedVegetarianFood,
28 percentage: 0.38,
29 backgroundColor: const Color(0xFFE8F5E9),
30 iconColor: const Color(0xFF4CAF50),
31 progressColor: const Color(0xFF4CAF50),
32 progressBackgroundColor: const Color(0xFFE8F5E9),
33 ),
35 name: 'Waste',
36 icon: HugeIcons.strokeRoundedWasteRestore,
37 percentage: 0.19,
38 backgroundColor: const Color(0xFFFFECE6),
39 iconColor: const Color(0xFFFF8A65),
40 progressColor: const Color(0xFFFF8A65),
41 progressBackgroundColor: const Color(0xFFFFECE6),
42 ),
44 name: 'Transports',
45 icon: HugeIcons.strokeRoundedContainerTruck,
46 percentage: 0.05,
47 backgroundColor: const Color(0xFFE3F2FD),
48 iconColor: const Color(0xFF2196F3),
49 progressColor: const Color(0xFF2196F3),
50 progressBackgroundColor: const Color(0xFFE3F2FD),
51 ),
53 name: 'Water',
54 icon: HugeIcons.strokeRoundedDroplet,
55 percentage: 0.01,
56 backgroundColor: const Color(0xFFE1F5FE),
57 iconColor: const Color(0xFF03A9F4),
58 progressColor: const Color(0xFF03A9F4),
59 progressBackgroundColor: const Color(0xFFE1F5FE),
60 ),
61 ],
62 ),
63 );
64 }
65}
66
68 final List<EmissionCategory> categories;
69
71 super.key,
72 required this.categories,
73 });
74
75 @override
76 Widget build(BuildContext context) {
77 return Column(
78 children: [
79 ListView.separated(
80 shrinkWrap: true,
81 physics: const NeverScrollableScrollPhysics(),
82 padding: EdgeInsets.zero,
83 itemCount: categories.length,
84 separatorBuilder: (context, index) => const SizedBox(height: 16),
85 itemBuilder: (context, index) {
86 final category = categories[index];
87 return CategoryProgressItem(category: category);
88 },
89 ),
90 SizedBox(height: 4.sp),
91 ],
92 );
93 }
94}
95
96class CategoryProgressItem extends StatelessWidget {
98
100 super.key,
101 required this.category,
102 });
103
104 @override
105 Widget build(BuildContext context) {
106 return Row(
107 children: [
108 Container(
109 width: 40.sp,
110 height: 40.sp,
111 decoration: BoxDecoration(
112 borderRadius: BorderRadius.circular(12),
113 ),
114 child: Icon(
115 category.icon,
116 color: category.iconColor,
117 ),
118 ),
119 SizedBox(width: 7.sp),
120 Expanded(
121 child: Column(
122 crossAxisAlignment: CrossAxisAlignment.center,
123 mainAxisAlignment: MainAxisAlignment.center,
124 children: [
125 Row(
126 mainAxisAlignment: MainAxisAlignment.spaceBetween,
127 children: [
128 Text(
129 category.name,
130 style: Theme.of(context).textTheme.bodySmall,
131 ),
132 Text(
133 '${(category.percentage * 100).toInt()}%',
134 style: Theme.of(context).textTheme.bodySmall?.copyWith(
135 color: Theme.of(context).hintColor,
136 fontSize: 10.sp,
137 ),
138 ),
139 ],
140 ),
141 SizedBox(height: 12.sp),
142 ClipRRect(
143 borderRadius: BorderRadius.circular(4),
144 child: LinearProgressIndicator(
145 value: category.percentage,
146 backgroundColor: category.progressBackgroundColor,
147 valueColor:
148 AlwaysStoppedAnimation<Color>(category.progressColor),
149 minHeight: 4,
150 ),
151 ),
152 ],
153 ),
154 ),
155 ],
156 );
157 }
158}
159
160class EmissionCategory {
161 final String name;
162 final IconData icon;
163 final double percentage;
164 final Color backgroundColor;
165 final Color iconColor;
166 final Color progressColor;
168
170 required this.name,
171 required this.icon,
172 required this.percentage,
173 required this.backgroundColor,
174 required this.iconColor,
175 required this.progressColor,
176 required this.progressBackgroundColor,
177 });
178}
final IconData icon
const CustomCard({ super.key, required this.child, this.padding, this.bgColor, })
const CategoryProgressItem({ super.key, required this.category, })
final Widget child
const EmissionsBreakdownList({super.key})
override Widget build(BuildContext context)
final EmissionCategory category
final String name
final EdgeInsets padding
final Color backgroundColor
const EmissionsBreakdown({ super.key, required this.categories, })
final Color iconColor
EmissionCategory({ required this.name, required this.icon, required this.percentage, required this.backgroundColor, required this.iconColor, required this.progressColor, required this.progressBackgroundColor, })
final Color progressBackgroundColor
final Color progressColor
class EmissionsBreakdownList extends StatelessWidget categories
final double percentage