import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'dart:math'; import '../../generated/locale_keys.g.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:cryptocurrency_app/constants/utils.dart' as Utils; class LineChartWidget extends StatelessWidget { final List data; final Color color; final bool loading; final bool error; const LineChartWidget( {Key? key, this.data = const [], this.color = const Color(0xff02d39a), this.loading = false, this.error = false}) : super(key: key); @override Widget build(BuildContext context) { return Stack(alignment: AlignmentDirectional.center, children: [ Opacity( opacity: data.length > 0 && !loading & !error ? 1 : 0.3, child: Container( width: double.infinity, child: LineChart( mainData(data.length > 0 && !loading & !error ? data : Utils.demoGraphData), swapAnimationDuration: Duration(seconds: 0), ), ), ), if (loading) Center( child: CircularProgressIndicator(), ) else if (error || data.length == 0) Center( child: Text(LocaleKeys.noResults.tr(), style: Theme.of(context).textTheme.headline3), ) ]); } LineChartData mainData(List data) { return LineChartData( gridData: FlGridData( show: true, drawVerticalLine: false, drawHorizontalLine: false, horizontalInterval: 4, getDrawingHorizontalLine: (value) { return FlLine( color: const Color(0xff37434d), strokeWidth: 1, ); }, getDrawingVerticalLine: (value) { return FlLine( color: const Color(0xff37434d), strokeWidth: 1, ); }, ), titlesData: FlTitlesData( show: false, ), borderData: FlBorderData( show: false, ), minX: 0, maxX: data.length.toDouble() - 1, minY: data.reduce(min).toDouble(), maxY: data.reduce(max).toDouble(), lineBarsData: [ LineChartBarData( spots: listData(data), colors: [color], barWidth: 3, isStrokeCapRound: true, dotData: FlDotData( show: false, ), belowBarData: BarAreaData( show: true, gradientFrom: Offset(0, .9), gradientTo: Offset(0, 0.5), colors: [color.withOpacity(.01), color.withOpacity(.3)], ), ), ], ); } List listData(List data) { return data .mapIndexed((e, i) => FlSpot(i.toDouble(), e.toDouble())) .toList(); } } extension IndexedIterable on Iterable { Iterable mapIndexed(T Function(E e, int i) f) { var i = 0; return map((e) => f(e, i++)); } }