From 33f9add78a7be32d0b6502db6d5268f67076ca17 Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Mon, 26 May 2025 10:34:57 +0300 Subject: [PATCH] Extracted some logic of `RangeOfAqiChart` into a helper class. --- .../helpers/range_of_aqi_charts_helper.dart | 55 +++++++++ .../widgets/range_of_aqi_chart.dart | 105 ++++-------------- 2 files changed, 77 insertions(+), 83 deletions(-) create mode 100644 lib/pages/analytics/modules/air_quality/helpers/range_of_aqi_charts_helper.dart diff --git a/lib/pages/analytics/modules/air_quality/helpers/range_of_aqi_charts_helper.dart b/lib/pages/analytics/modules/air_quality/helpers/range_of_aqi_charts_helper.dart new file mode 100644 index 00000000..d00c7357 --- /dev/null +++ b/lib/pages/analytics/modules/air_quality/helpers/range_of_aqi_charts_helper.dart @@ -0,0 +1,55 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/analytics/modules/energy_management/helpers/energy_management_charts_helper.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; + +abstract final class RangeOfAqiChartsHelper { + const RangeOfAqiChartsHelper._(); + + static const gradientData = <(Color color, String label)>[ + (ColorsManager.goodGreen, 'Good'), + (ColorsManager.moderateYellow, 'Moderate'), + (ColorsManager.poorOrange, 'Poor'), + (ColorsManager.unhealthyRed, 'Unhealthy'), + (ColorsManager.severePink, 'Severe'), + (ColorsManager.hazardousPurple, 'Hazardous'), + ]; + + static FlTitlesData titlesData(BuildContext context) { + final titlesData = EnergyManagementChartsHelper.titlesData(context); + return titlesData.copyWith( + leftTitles: titlesData.leftTitles.copyWith( + sideTitles: titlesData.leftTitles.sideTitles.copyWith( + reservedSize: 70, + interval: 51, + maxIncluded: true, + getTitlesWidget: (value, meta) { + String text; + if (value >= 300) { + text = '300+'; + } else if (value == 255) { + text = '300'; + } else { + text = ((value / 50).round() * 50).toInt().toString(); + } + return Padding( + padding: const EdgeInsetsDirectional.only(end: 12), + child: FittedBox( + alignment: AlignmentDirectional.centerStart, + fit: BoxFit.scaleDown, + child: Text( + text, + style: context.textTheme.bodySmall?.copyWith( + fontSize: 12, + color: ColorsManager.lightGreyColor, + ), + ), + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart.dart b/lib/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart.dart index e0a8107f..b179ec4a 100644 --- a/lib/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart.dart +++ b/lib/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart.dart @@ -1,8 +1,8 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/analytics/modules/air_quality/helpers/range_of_aqi_charts_helper.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/helpers/energy_management_charts_helper.dart'; import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/utils/extension/build_context_x.dart'; class RangeOfAqiChart extends StatelessWidget { final List minValues; @@ -16,15 +16,6 @@ class RangeOfAqiChart extends StatelessWidget { required this.maxValues, }); - static const _gradientColors = [ - ColorsManager.goodGreen, - ColorsManager.moderateYellow, - ColorsManager.poorOrange, - ColorsManager.unhealthyRed, - ColorsManager.severePink, - ColorsManager.hazardousPurple, - ]; - @override Widget build(BuildContext context) { return Stack( @@ -33,10 +24,8 @@ class RangeOfAqiChart extends StatelessWidget { LineChartData( minY: 0, maxY: 301, - gridData: EnergyManagementChartsHelper.gridData( - horizontalInterval: 50, - ), - titlesData: _titlesData(context), + gridData: EnergyManagementChartsHelper.gridData(horizontalInterval: 50), + titlesData: RangeOfAqiChartsHelper.titlesData(context), borderData: EnergyManagementChartsHelper.borderData(), betweenBarsData: [ BetweenBarsData( @@ -45,18 +34,29 @@ class RangeOfAqiChart extends StatelessWidget { gradient: LinearGradient( begin: Alignment.bottomCenter, end: Alignment.topCenter, - colors: _gradientColors - .map( - (e) => e.withValues(alpha: 0.8), - ) - .toList(), + colors: RangeOfAqiChartsHelper.gradientData.map((e) { + final (color, _) = e; + return color.withValues(alpha: 0.8); + }).toList(), ), ), ], lineBarsData: [ - _buildMaxLine(), - _buildAverageLine(), - _buildMinLine(), + _buildLine( + values: maxValues, + color: const Color(0xFF962DFF), + dotColor: const Color(0xFF5F00BD), + ), + _buildLine( + values: avgValues, + color: Colors.white, + dotColor: null, + ), + _buildLine( + values: minValues, + color: const Color(0xFF93AAFD), + dotColor: const Color(0xFF023DFE), + ), ], ), ), @@ -64,30 +64,6 @@ class RangeOfAqiChart extends StatelessWidget { ); } - LineChartBarData _buildMinLine() { - return _buildLine( - values: minValues, - color: const Color(0xFF93AAFD), - dotColor: const Color(0xFF023DFE), - ); - } - - LineChartBarData _buildAverageLine() { - return _buildLine( - values: avgValues, - color: Colors.white, - dotColor: null, - ); - } - - LineChartBarData _buildMaxLine() { - return _buildLine( - values: maxValues, - color: const Color(0xFF962DFF), - dotColor: const Color(0xFF5F00BD), - ); - } - FlDotData _buildDotData(Color color) { return FlDotData( show: true, @@ -119,41 +95,4 @@ class RangeOfAqiChart extends StatelessWidget { belowBarData: BarAreaData(show: false), ); } - - FlTitlesData _titlesData(BuildContext context) { - final titlesData = EnergyManagementChartsHelper.titlesData(context); - return titlesData.copyWith( - leftTitles: titlesData.leftTitles.copyWith( - sideTitles: titlesData.leftTitles.sideTitles.copyWith( - reservedSize: 70, - interval: 51, - maxIncluded: true, - getTitlesWidget: (value, meta) { - String text; - if (value >= 300) { - text = '300+'; - } else if (value == 255) { - text = '300'; - } else { - text = ((value / 50).round() * 50).toInt().toString(); - } - return Padding( - padding: const EdgeInsetsDirectional.only(end: 12), - child: FittedBox( - alignment: AlignmentDirectional.centerStart, - fit: BoxFit.scaleDown, - child: Text( - text, - style: context.textTheme.bodySmall?.copyWith( - fontSize: 12, - color: ColorsManager.lightGreyColor, - ), - ), - ), - ); - }, - ), - ), - ); - } }