Newer
Older
import 'package:easy_localization/easy_localization.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:scrobbles/config/app_colors.dart';
import 'package:scrobbles/utils/color_extensions.dart';
class CustomBarChart extends StatelessWidget {
final double chartHeight = 150.0;
final double verticalTicksInterval = 10;
final String verticalAxisTitleSuffix = '';
final double titleFontSize = 10;
@override
Widget build(BuildContext context) {
return Container(
child: SizedBox(
height: this.chartHeight,
),
);
}
BarChart getBarChart({barWidth, backgroundColor}) {
return BarChart(
BarChartData(
barGroups: getDataCounts(barWidth),
backgroundColor: backgroundColor,
borderData: getBorderData(),
gridData: getGridData(),
titlesData: getTitlesData(),
maxY: getNextRoundNumber(getMaxCountsValue(), this.verticalTicksInterval),
),
);
}
double getBarWidth(double containerWidth, int barsCount) {
return 0.65 * (containerWidth / barsCount);
}
List<BarChartGroupData> getDataCounts(double barWidth) {
return [];
}
double getMaxCountsValue() {
return 0.0;
}
double getNextRoundNumber(double number, double scale) {
return scale * ((number ~/ scale).toInt() + 1);
}
BarChartGroupData getBarItem(
{required int x,
required List<double> values,
required List<Color> barColors,
for (int i = 0; i < values.length; i++) {
double value = values[i];
Color barColor = barColors[i];
final gradient = this.getGradient(barColor, value, this.getMaxCountsValue());
final borderColor = barColor.darken(20);
barRods.add(
BarChartRodData(
toY: value,
color: barColor,
gradient: gradient,
width: barWidth,
borderRadius: BorderRadius.all(Radius.zero),
borderSide: BorderSide(
color: borderColor,
),
),
);
}
return BarChartGroupData(
x: x,
barRods: barRods,
LinearGradient getGradient(Color baseColor, double value, double maxValue) {
double alignmentTopValue = value != 0.0 ? -2 * maxValue / value + 1 : 0;
begin: Alignment(-1, alignmentTopValue),
end: Alignment(1, 1),
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
colors: <Color>[
baseColor.lighten(30),
baseColor,
baseColor.darken(30),
],
tileMode: TileMode.mirror,
);
}
FlBorderData getBorderData() {
return FlBorderData(
show: true,
border: Border.all(
color: AppColors.borderColor,
width: 2,
),
);
}
FlGridData getGridData() {
return const FlGridData(
show: true,
drawHorizontalLine: true,
drawVerticalLine: false,
);
}
FlTitlesData getTitlesData() {
const AxisTitles none = const AxisTitles(
sideTitles: SideTitles(showTitles: false),
);
final AxisTitles verticalTitles = AxisTitles(
sideTitles: SideTitles(
showTitles: true,
getTitlesWidget: getVerticalTitlesWidget,
interval: this.verticalTicksInterval,
),
);
final AxisTitles verticalSpacer = AxisTitles(
sideTitles: SideTitles(
showTitles: true,
reservedSize: 35,
getTitlesWidget: getVerticalTitlesSpacerWidget,
interval: this.verticalTicksInterval,
),
);
final AxisTitles horizontalTitles = AxisTitles(
sideTitles: SideTitles(
showTitles: true,
reservedSize: 20,
getTitlesWidget: getHorizontalTitlesWidget,
),
);
return FlTitlesData(
show: true,
bottomTitles: horizontalTitles,
leftTitles: verticalTitles,
topTitles: none,
rightTitles: verticalSpacer,
);
}
Widget getVerticalTitlesWidget(double value, TitleMeta meta) {
String suffix =
this.verticalAxisTitleSuffix != '' ? ' ' + this.verticalAxisTitleSuffix : '';
return SideTitleWidget(
axisSide: meta.axisSide,
space: 4,
child: Text(
value.toInt().toString() + suffix,
style: TextStyle(
fontSize: this.titleFontSize,
Widget getVerticalTitlesSpacerWidget(double value, TitleMeta meta) {
return SideTitleWidget(
axisSide: meta.axisSide,
space: 4,
child: Text(''),
);
}
Widget getHorizontalTitlesWidget(double value, TitleMeta meta) {
final DateFormat formatter = DateFormat('dd/MM');
final DateTime date = DateTime.fromMillisecondsSinceEpoch(value.toInt());
final String text = formatter.format(date);
return SideTitleWidget(
axisSide: meta.axisSide,
space: 4,
child: Padding(
padding: EdgeInsets.only(right: 10),
child: RotationTransition(
turns: new AlwaysStoppedAnimation(-30 / 360),
child: Text(
text,
style: TextStyle(
color: AppColors.mainTextColor1,
fontSize: this.titleFontSize,
),