import 'package:hmg_patient_app/widgets/charts/app_time_series_chart.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import '../../../../Constants.dart'; class LineChartCurved extends StatelessWidget { final String? title; final List? timeSeries; final int? indexes; final double? horizontalInterval; LineChartCurved({this.title, this.timeSeries, this.indexes, this.horizontalInterval = 20.0}); List xAxixs = []; List yAxixs = []; @override Widget build(BuildContext context) { getXaxix(); getYaxix(); return AspectRatio( aspectRatio: 1.0, 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, ), Text( title!, style: TextStyle(color: Colors.black, fontSize: 16, letterSpacing: -0.64, fontWeight: FontWeight.w600), textAlign: TextAlign.center, ), SizedBox( height: 10, ), Expanded( child: Padding( padding: const EdgeInsets.only(right: 18.0, left: 16.0), child: LineChart( sampleData1(context), duration: 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, horizontalInterval: 14, verticalInterval: 14), // titlesData: FlTitlesData( // bottomTitles: SideTitles( // showTitles: true, // getTextStyles: (value) => const TextStyle( // color: Colors.black, // fontSize: 10, // ), // // rotateAngle: 90, // //rotateAngle:-65, // margin: 22, // getTitles: (value) { // if (timeSeries.length < 15) { // if (timeSeries.length > value.toInt()) { // 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, // // interval:getMaxY() - getMinY() <=500?50:getMaxY() - getMinY() <=1000?100:200, // interval: 3, // getTextStyles: (value) => const TextStyle( // color: Colors.black, // fontWeight: FontWeight.bold, // fontSize: 10, // ), // // 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: 0, // //getMinY(), // lineBarsData: getData(context), // ); // } LineChartData sampleData1(context) { return LineChartData( lineTouchData: LineTouchData( touchTooltipData: LineTouchTooltipData( // tooltipBgColor: Colors.white, ), touchCallback: (touchEvent, LineTouchResponse? touchResponse) {}, handleBuiltInTouches: true, ), gridData: FlGridData(show: true, drawVerticalLine: true, drawHorizontalLine: true, horizontalInterval: 14, verticalInterval: 14), titlesData: FlTitlesData( bottomTitles: AxisTitles( axisNameSize: 22, sideTitles: SideTitles( showTitles: true, //Changed By Aamir // rotateAngle: -65, // margin: 22, getTitlesWidget: (value, title) { TextStyle style = TextStyle( color: Colors.black, fontSize: 10, ); if (timeSeries!.length < 15) { if (timeSeries!.length > value.toInt()) { return Text( '${timeSeries![value.toInt()].time.month}/ ${timeSeries![value.toInt()].time.year}', style: style, ); } else return SizedBox(); } else { if (value.toInt() == 0) return Text('${timeSeries![value.toInt()].time.month}/ ${timeSeries![value.toInt()].time.year}', style: style); if (value.toInt() == timeSeries!.length - 1) return Text('${timeSeries![value.toInt()].time.month}/ ${timeSeries![value.toInt()].time.year}', style: style); if (xAxixs.contains(value.toInt())) { return Text( '${timeSeries![value.toInt()].time.month}/ ${timeSeries![value.toInt()].time.year}', style: style, ); } } return SizedBox(); }, ), ), leftTitles: AxisTitles( sideTitles: SideTitles( showTitles: true, interval: 3.0, getTitlesWidget: (val, title) { TextStyle styl = const TextStyle( color: Colors.black, fontWeight: FontWeight.bold, fontSize: 10, ); return Text( "", style: styl, ); } // interval: getMaxY() - getMinY() <= 500 // ? getMaxY() - getMinY() <= 50 // ? 10 // : 10 // : getMaxY() - getMinY() <= 1000 // ? 100 // : getMaxY() - getMinY() >= 10000 // ? 5000 // : 200, //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: 0, //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!.isEmpty ? 0 : timeSeries!.first.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 = []; for (int index = 0; index < timeSeries!.length; index++) { spots.add(FlSpot(index.toDouble(), timeSeries![index].sales)); } final LineChartBarData lineChartBarData1 = LineChartBarData( spots: spots, isCurved: true, color: secondaryColor, barWidth: 1.5, isStrokeCapRound: true, dotData: FlDotData( show: false, ), belowBarData: BarAreaData( show: false, ), ); return [ lineChartBarData1, ]; } }