unsort all data from AqiDistributionChart since the api returns it sorted, and the pacakge handles sorting.

This commit is contained in:
Faris Armoush
2025-06-16 10:29:03 +03:00
parent 89e12e47da
commit 312d185932

View File

@ -16,11 +16,6 @@ class AqiDistributionChart extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final sortedData = List<AirQualityDataModel>.from(chartData)
..sort(
(a, b) => a.date.compareTo(b.date),
);
return BarChart( return BarChart(
BarChartData( BarChartData(
maxY: 100.1, maxY: 100.1,
@ -30,29 +25,25 @@ class AqiDistributionChart extends StatelessWidget {
borderData: EnergyManagementChartsHelper.borderData(), borderData: EnergyManagementChartsHelper.borderData(),
barTouchData: _barTouchData(context), barTouchData: _barTouchData(context),
titlesData: _titlesData(context), titlesData: _titlesData(context),
barGroups: _buildBarGroups(sortedData), barGroups: _buildBarGroups(),
), ),
duration: Duration.zero, duration: Duration.zero,
); );
} }
List<BarChartGroupData> _buildBarGroups(List<AirQualityDataModel> sortedData) { List<BarChartGroupData> _buildBarGroups() {
return List.generate(sortedData.length, (index) { return List.generate(chartData.length, (index) {
final data = sortedData[index]; final data = chartData[index];
final stackItems = <BarChartRodData>[]; final stackItems = <BarChartRodData>[];
double currentY = 0; double currentY = 0;
bool isFirstElement = true; var isFirstElement = true;
// Sort data by type to ensure consistent order for (final percentageData in data.data) {
final sortedPercentageData = List<AirQualityPercentageData>.from(data.data)
..sort((a, b) => a.type.compareTo(b.type));
for (final percentageData in sortedPercentageData) {
stackItems.add( stackItems.add(
BarChartRodData( BarChartRodData(
fromY: currentY, fromY: currentY,
toY: currentY + percentageData.percentage, toY: currentY + percentageData.percentage,
color: AirQualityDataModel.metricColors[percentageData.name]!, color: AirQualityDataModel.metricColors[percentageData.type],
borderRadius: isFirstElement borderRadius: isFirstElement
? const BorderRadius.only( ? const BorderRadius.only(
topLeft: Radius.circular(22), topLeft: Radius.circular(22),
@ -84,23 +75,21 @@ class AqiDistributionChart extends StatelessWidget {
tooltipRoundedRadius: 16, tooltipRoundedRadius: 16,
tooltipPadding: const EdgeInsets.all(8), tooltipPadding: const EdgeInsets.all(8),
getTooltipItem: (group, groupIndex, rod, rodIndex) { getTooltipItem: (group, groupIndex, rod, rodIndex) {
final data = chartData[group.x.toInt()]; final data = chartData[group.x];
final List<TextSpan> children = []; final children = <TextSpan>[];
final textStyle = context.textTheme.bodySmall?.copyWith( final textStyle = context.textTheme.bodySmall?.copyWith(
color: ColorsManager.blackColor, color: ColorsManager.blackColor,
fontSize: 12, fontSize: 8,
); );
// Sort data by type to ensure consistent order for (final percentageData in data.data) {
final sortedPercentageData = List<AirQualityPercentageData>.from(data.data) final percentage = percentageData.percentage.toStringAsFixed(1);
..sort((a, b) => a.type.compareTo(b.type)); final type = percentageData.type[0].toUpperCase() +
percentageData.type.substring(1).replaceAll('_', ' ');
for (final percentageData in sortedPercentageData) {
children.add(TextSpan( children.add(TextSpan(
text: text: '\n$type: $percentage%',
'\n${percentageData.type.toUpperCase()}: ${percentageData.percentage.toStringAsFixed(1)}%',
style: textStyle, style: textStyle,
)); ));
} }
@ -109,9 +98,10 @@ class AqiDistributionChart extends StatelessWidget {
DateFormat('dd/MM/yyyy').format(data.date), DateFormat('dd/MM/yyyy').format(data.date),
context.textTheme.bodyMedium!.copyWith( context.textTheme.bodyMedium!.copyWith(
color: ColorsManager.blackColor, color: ColorsManager.blackColor,
fontSize: 16, fontSize: 9,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
textAlign: TextAlign.start,
children: children, children: children,
); );
}, },