import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; class LineChartWidget extends StatelessWidget { const LineChartWidget({ required this.spots, this.title, this.lineColor, this.gradientColors, this.minY, this.maxY, this.showGrid = true, this.bottomTitles, this.leftTitles, super.key, }); final List spots; final String? title; final Color? lineColor; final List? gradientColors; final double? minY; final double? maxY; final bool showGrid; final Widget Function(double, TitleMeta)? bottomTitles; final Widget Function(double, TitleMeta)? leftTitles; @override Widget build(BuildContext context) { final theme = Theme.of(context); final primaryColor = lineColor ?? theme.colorScheme.primary; final colors = gradientColors ?? [ primaryColor, primaryColor.withValues(alpha: 0.3), ]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (title != null) Padding( padding: const EdgeInsets.only(bottom: 16), child: Text( title!, style: theme.textTheme.titleMedium?.copyWith( fontWeight: FontWeight.bold, ), ), ), Expanded( child: LineChart( LineChartData( gridData: FlGridData(show: showGrid), titlesData: FlTitlesData( topTitles: const AxisTitles( sideTitles: SideTitles(showTitles: false), ), rightTitles: const AxisTitles( sideTitles: SideTitles(showTitles: false), ), bottomTitles: AxisTitles( sideTitles: SideTitles( showTitles: true, getTitlesWidget: bottomTitles ?? (value, meta) => SideTitleWidget( meta: meta, child: Text( value.toInt().toString(), style: theme.textTheme.bodySmall, ), ), ), ), leftTitles: AxisTitles( sideTitles: SideTitles( showTitles: true, reservedSize: 40, getTitlesWidget: leftTitles ?? (value, meta) => SideTitleWidget( meta: meta, child: Text( value.toInt().toString(), style: theme.textTheme.bodySmall, ), ), ), ), ), borderData: FlBorderData(show: false), minY: minY, maxY: maxY, lineBarsData: [ LineChartBarData( spots: spots, isCurved: true, color: primaryColor, barWidth: 3, isStrokeCapRound: true, dotData: const FlDotData(show: false), belowBarData: BarAreaData( show: true, gradient: LinearGradient( colors: colors, begin: Alignment.topCenter, end: Alignment.bottomCenter, ), ), ), ], ), ), ), ], ); } }