bar_graph_widget.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import 'package:fitness_dashboard_ui/data/bar_graph_data.dart';
  2. import 'package:fitness_dashboard_ui/model/graph_model.dart';
  3. import 'package:fitness_dashboard_ui/widgets/custom_card_widget.dart';
  4. import 'package:fl_chart/fl_chart.dart';
  5. import 'package:flutter/material.dart';
  6. class BarGraphCard extends StatelessWidget {
  7. const BarGraphCard({super.key});
  8. @override
  9. Widget build(BuildContext context) {
  10. final barGraphData = BarGraphData();
  11. return GridView.builder(
  12. itemCount: barGraphData.data.length,
  13. shrinkWrap: true,
  14. physics: const ScrollPhysics(),
  15. gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
  16. crossAxisCount: 3,
  17. crossAxisSpacing: 15,
  18. mainAxisSpacing: 12.0,
  19. childAspectRatio: 5 / 4,
  20. ),
  21. itemBuilder: (context, index) {
  22. return CustomCard(
  23. padding: const EdgeInsets.all(5),
  24. child: Column(
  25. crossAxisAlignment: CrossAxisAlignment.start,
  26. children: [
  27. Padding(
  28. padding: const EdgeInsets.all(8.0),
  29. child: Text(
  30. barGraphData.data[index].label,
  31. style: const TextStyle(
  32. fontSize: 14,
  33. fontWeight: FontWeight.w500,
  34. ),
  35. ),
  36. ),
  37. const SizedBox(height: 12),
  38. Expanded(
  39. child: BarChart(
  40. BarChartData(
  41. barGroups: _chartGroups(
  42. points: barGraphData.data[index].graph,
  43. color: barGraphData.data[index].color,
  44. ),
  45. borderData: FlBorderData(border: const Border()),
  46. gridData: FlGridData(show: false),
  47. titlesData: FlTitlesData(
  48. bottomTitles: AxisTitles(
  49. sideTitles: SideTitles(
  50. showTitles: true,
  51. getTitlesWidget: (value, meta) {
  52. return Padding(
  53. padding: const EdgeInsets.only(top: 5),
  54. child: Text(
  55. barGraphData.label[value.toInt()],
  56. style: const TextStyle(
  57. fontSize: 11,
  58. color: Colors.grey,
  59. fontWeight: FontWeight.w500),
  60. ),
  61. );
  62. },
  63. ),
  64. ),
  65. leftTitles: AxisTitles(
  66. sideTitles: SideTitles(showTitles: false),
  67. ),
  68. topTitles: AxisTitles(
  69. sideTitles: SideTitles(showTitles: false),
  70. ),
  71. rightTitles: AxisTitles(
  72. sideTitles: SideTitles(showTitles: false),
  73. ),
  74. ),
  75. ),
  76. ),
  77. ),
  78. ],
  79. ),
  80. );
  81. },
  82. );
  83. }
  84. List<BarChartGroupData> _chartGroups(
  85. {required List<GraphModel> points, required Color color}) {
  86. return points
  87. .map((point) => BarChartGroupData(x: point.x.toInt(), barRods: [
  88. BarChartRodData(
  89. toY: point.y,
  90. width: 12,
  91. color: color.withOpacity(point.y.toInt() > 4 ? 1 : 0.4),
  92. borderRadius: const BorderRadius.only(
  93. topLeft: Radius.circular(3.0),
  94. topRight: Radius.circular(3.0),
  95. ),
  96. )
  97. ]))
  98. .toList();
  99. }
  100. }