import 'package:date_time_picker/date_time_picker.dart'; import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/widgets/charts/app_time_series_chart.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; class LineChartCurved extends StatelessWidget { final String title; final List timeSeries; final int indexes; LineChartCurved({this.title, this.timeSeries, this.indexes}); List xAxixs = List(); List yAxixs = List(); // DateFormat format = DateFormat("yyyy-MM-dd"); DateFormat yearFormat = DateFormat("yyyy/MMM"); DateFormat monthFormat = DateFormat("MMM"); bool isDatesSameYear = true; @override Widget build(BuildContext context) { getXaxix(); getYaxix(); return AspectRatio( aspectRatio: 1.1, child: Container( decoration: const BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(18)), // color: Colors.white, ), child: Stack( children: [ Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox( height: 4, ), Container( padding: const EdgeInsets.only(right: 18.0, left: 16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppText( title, fontSize: SizeConfig.textMultiplier * 2.1, fontWeight: FontWeight.bold, fontFamily: 'Poppins', textAlign: TextAlign.center, ), ], ), ), SizedBox( height: 16, ), Expanded( child: Padding( padding: const EdgeInsets.only(right: 18.0, left: 16.0), child: LineChart( sampleData1(context), swapAnimationDuration: const Duration(milliseconds: 250), ), ), ), const SizedBox( height: 10, ), ], ), ], ), ), ); } getXaxix() { for (int index = 0; index < timeSeries.length; index++) { int mIndex = indexes * index; if (mIndex < timeSeries.length) { xAxixs.add(mIndex); } } } getYaxix() { int indexess = (timeSeries.length * 0.30).toInt(); for (int index = 0; index < timeSeries.length; index++) { int mIndex = indexess * index; if (mIndex < timeSeries.length) { yAxixs.add(timeSeries[mIndex].sales); } } } LineChartData sampleData1(context) { return LineChartData( lineTouchData: LineTouchData( touchTooltipData: LineTouchTooltipData( tooltipBgColor: Colors.white, ), touchCallback: (LineTouchResponse touchResponse) {}, handleBuiltInTouches: true, ), gridData: FlGridData( show: true, drawVerticalLine: true, drawHorizontalLine: true), titlesData: FlTitlesData( bottomTitles: SideTitles( showTitles: true, getTextStyles: (value) => const TextStyle( color: Colors.black, fontSize: 10, ), rotateAngle: -65, //rotateAngle:-65, margin: 22, getTitles: (value) { if (timeSeries.length < 15) { if (timeSeries.length > value.toInt()) { DateTime dateTime = timeSeries[value.toInt()].time; if (isDatesSameYear) { return monthFormat.format(dateTime); } else { return yearFormat.format(dateTime); } } else { return ''; } } else { if (value.toInt() == 0 || value.toInt() == timeSeries.length - 1 || xAxixs.contains(value.toInt())) { DateTime dateTime = timeSeries[value.toInt()].time; if (isDatesSameYear) { return monthFormat.format(dateTime); } else { return yearFormat.format(dateTime); } } } /*if (timeSeries.length < 15) { if (timeSeries.length > value.toInt()) { DateTime dateTime = timeSeries[value.toInt()].time; return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; } else return ''; } else { if (value.toInt() == 0) return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; if (value.toInt() == timeSeries.length - 1) return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; if (xAxixs.contains(value.toInt())) { return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; } }*/ return ''; }, ), leftTitles: SideTitles( showTitles: true, getTextStyles: (value) => const TextStyle( color: Colors.black, fontWeight: FontWeight.bold, fontSize: 10, ), getTitles: (value) { // if (timeSeries.length < 10) { // return '${value.toInt()}'; // } else { // if (value == getMinY()) // return '${value.toInt()}'; // if (value == getMaxY()) // return '${value.toInt()}'; // if (yAxixs.contains(value)) { // return '${value.toInt()}'; // } // return ''; // } return '${value.toInt()}'; }, margin: 12, ), ), borderData: FlBorderData( show: true, border: const Border( bottom: BorderSide( color: Colors.black, width: 0.5, ), left: BorderSide( color: Colors.black, ), right: BorderSide( color: Colors.black, ), top: BorderSide( color: Colors.transparent, ), ), ), minX: 0, maxX: (timeSeries.length - 1).toDouble(), maxY: getMaxY() + 0.3, minY: getMinY(), lineBarsData: getData(context), ); } double getMaxY() { double max = 0; timeSeries.forEach((element) { double resultValueDouble = element.sales; if (resultValueDouble > max) max = resultValueDouble; }); return max.roundToDouble(); } double getMinY() { double min = timeSeries[0].sales; timeSeries.forEach((element) { double resultValueDouble = element.sales; if (resultValueDouble < min) min = resultValueDouble; }); int value = min.toInt(); return value.toDouble(); } List getData(context) { List spots = List(); isDatesSameYear = true; int previousDateYear = 0; for (int index = 0; index < timeSeries.length; index++) { spots.add(FlSpot(index.toDouble(), timeSeries[index].sales)); if (isDatesSameYear == false || (previousDateYear != 0 && previousDateYear != timeSeries[index].time.year)) { isDatesSameYear = false; } previousDateYear = timeSeries[index].time.year; } final LineChartBarData lineChartBarData1 = LineChartBarData( spots: spots, isCurved: true, colors: [Colors.red] /*[Theme.of(context).primaryColor]*/, barWidth: 5, isStrokeCapRound: true, dotData: FlDotData( show: false, ), belowBarData: BarAreaData( show: false, ), ); return [ lineChartBarData1, ]; } }