Files
flutter-frame/lib/shared/widgets/chart_widgets/line_chart_widget.dart
2026-03-01 07:55:59 +09:00

118 lines
3.6 KiB
Dart

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<FlSpot> spots;
final String? title;
final Color? lineColor;
final List<Color>? 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,
),
),
),
],
),
),
),
],
);
}
}