Newer
Older
import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:scrobbles/config/app_colors.dart';
import 'package:scrobbles/models/timeline.dart';
import 'package:scrobbles/ui/widgets/abstracts/custom_line_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart';
class ChartTimelineEclecticism extends CustomLineChart {
const ChartTimelineEclecticism({super.key, required this.chartData});
@override
Widget build(BuildContext context) {
final horizontalScale = getHorizontalScale();
if (this.chartData.data.keys.length == 0) {
return SizedBox(
height: this.chartHeight,
);
}
child: LineChart(
LineChartData(
lineBarsData: getDataEclecticism(),
borderData: getBorderData(),
gridData: getGridData(),
titlesData: getTitlesData(),
lineTouchData: const LineTouchData(enabled: false),
minX: horizontalScale['min'],
maxX: horizontalScale['max'],
maxY: 100,
minY: 0,
),
duration: const Duration(milliseconds: 250),
),
Map<String, double> getHorizontalScale() {
// Left/right margins: 12h, in milliseconds
int margin = 12 * 60 * 60 * 1000;
double minDateAsDouble = double.maxFinite;
double maxDateAsDouble = -double.maxFinite;
this.chartData.data.keys.forEach((element) {
TimelineDataValue? value = this.chartData.data[element];
if (value != null) {
final double date = DateTime.parse(element).millisecondsSinceEpoch.toDouble();
if (date < minDateAsDouble) {
minDateAsDouble = date;
}
if (date > maxDateAsDouble) {
maxDateAsDouble = date;
}
}
});
return {
'min': minDateAsDouble - margin,
'max': maxDateAsDouble + margin,
};
}
List<LineChartBarData> getDataEclecticism() {
List<FlSpot> spots = [];
this.chartData.data.keys.forEach((element) {
TimelineDataValue? value = this.chartData.data[element];
if (value != null) {
final double date = DateTime.parse(element).millisecondsSinceEpoch.toDouble();
final double eclecticism = value.eclecticism.toDouble();
spots.add(FlSpot(date, eclecticism));
}
});
final baseColor = AppColors.contentColorCyan;
final borderColor = baseColor.darken(20);
return [
LineChartBarData(
isCurved: true,
isStrokeCapRound: false,
dotData: const FlDotData(show: false),
spots: spots,
),
];
}
}