Skip to content
Snippets Groups Projects
Select Git revision
  • f0dc07a7ecdc184fc9e2f3099cb0a6d71fc618a8
  • master default protected
  • 88-upgrade-framework-and-dependencies
  • 82-reword-settings
  • 67-improve-app-metadata
  • 54-improve-discoveries-page
  • 7-add-lastfm-link
  • Release_0.9.0_77 protected
  • Release_0.8.4_76 protected
  • Release_0.8.3_75 protected
  • Release_0.8.2_74 protected
  • Release_0.8.1_73 protected
  • Release_0.8.0_72 protected
  • Release_0.7.0_71 protected
  • Release_0.6.0_70 protected
  • Release_0.5.0_69 protected
  • Release_0.4.2_68 protected
  • Release_0.4.1_67 protected
  • Release_0.4.0_66 protected
  • Release_0.3.1_65 protected
  • Release_0.3.0_64 protected
  • Release_0.2.2_63 protected
  • Release_0.2.1_62 protected
  • Release_0.2.0_61 protected
  • Release_0.1.2_60 protected
  • Release_0.1.1_59 protected
  • Release_0.1.0_58 protected
27 results

timeline_chart_eclecticism.dart

Blame
  • timeline_chart_eclecticism.dart 4.22 KiB
    import 'package:easy_localization/easy_localization.dart';
    import 'package:flutter/material.dart';
    import 'package:fl_chart/fl_chart.dart';
    
    import '../../../config/app_colors.dart';
    import '../../../models/timeline.dart';
    
    class ChartTimelineEclecticism extends StatelessWidget {
      final TimelineData chartData;
    
      const ChartTimelineEclecticism({super.key, required this.chartData});
    
      @override
      Widget build(BuildContext context) {
        return Container(
          height: 100.0,
          child: LineChart(
            LineChartData(
              lineBarsData: getDataEclecticism(),
              backgroundColor: Theme.of(context).colorScheme.onBackground,
              borderData: getBorderData(),
              gridData: getGridData(),
              titlesData: getTitlesData(),
              lineTouchData: getLineTouchDataEclecticism(),
              maxY: 100,
              minY: 0,
            ),
            duration: const Duration(milliseconds: 250),
          ),
        );
      }
    
      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));
          }
        });
    
        return [
          LineChartBarData(
            isCurved: true,
            color: AppColors.contentColorCyan,
            barWidth: 3,
            isStrokeCapRound: false,
            dotData: const FlDotData(show: false),
            belowBarData: BarAreaData(show: true),
            spots: spots,
          ),
        ];
      }
    
      FlBorderData getBorderData() {
        return FlBorderData(
          show: true,
          border: Border.all(
            color: AppColors.borderColor,
            width: 2,
          ),
        );
      }
    
      FlGridData getGridData() {
        return const FlGridData(
          show: true,
        );
      }
    
      FlTitlesData getTitlesData() {
        const AxisTitles none = const AxisTitles(
          sideTitles: SideTitles(showTitles: false),
        );
    
        final AxisTitles verticalTitles = AxisTitles(
          sideTitles: SideTitles(
            showTitles: true,
            reservedSize: 30,
            getTitlesWidget: getVerticalTitlesWidget,
            interval: 25,
          ),
        );
        final AxisTitles horizontalTitles = AxisTitles(
          sideTitles: SideTitles(
            showTitles: true,
            reservedSize: 20,
            getTitlesWidget: getHorizontalTitlesWidget,
          ),
        );
    
        return FlTitlesData(
          show: true,
          bottomTitles: horizontalTitles,
          leftTitles: none,
          topTitles: none,
          rightTitles: verticalTitles,
        );
      }
    
      Widget getVerticalTitlesWidget(double value, TitleMeta meta) {
        return SideTitleWidget(
          axisSide: meta.axisSide,
          space: 4,
          child: Text(
            value.toInt().toString(),
            style: const TextStyle(
              color: AppColors.mainTextColor1,
              fontSize: 12,
            ),
          ),
        );
      }
    
      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: RotationTransition(
            turns: new AlwaysStoppedAnimation(-30 / 360),
            child: Text(
              text,
              style: const TextStyle(
                color: AppColors.mainTextColor1,
                fontSize: 11,
              ),
            ),
          ),
        );
      }
    
      LineTouchData getLineTouchDataEclecticism() {
        return LineTouchData(
          handleBuiltInTouches: true,
          touchTooltipData: LineTouchTooltipData(
            tooltipBgColor: Colors.transparent,
            tooltipPadding: EdgeInsets.all(8),
            tooltipMargin: 2,
            getTooltipItems: (List<LineBarSpot> touchedSpots) {
              return touchedSpots.map((LineBarSpot touchedSpot) {
                final textStyle = TextStyle(
                  color: AppColors.mainTextColor2,
                  fontWeight: FontWeight.bold,
                  fontSize: 10,
                );
                return LineTooltipItem(
                  touchedSpot.y.toString(),
                  textStyle,
                );
              }).toList();
            },
          ),
        );
      }
    }