You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
RSGDoctorApp/lib/screens/patients/profile/vital_sign/LineChartCurvedBloodPressur...

316 lines
9.9 KiB
Dart

3 years ago
import 'package:doctor_app_flutter/core/model/charts/app_time_series_chart.dart';
import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
class LineChartCurvedBloodPressureNew extends StatelessWidget {
3 years ago
final String? title;
final List<TimeSeriesSales2>? timeSeries1;
final List<TimeSeriesSales2>? timeSeries2;
final int? indexes;
final bool? isOX;
3 years ago
LineChartCurvedBloodPressureNew({this.title, this.timeSeries1, this.indexes, this.timeSeries2, this.isOX = false});
3 years ago
List<int> xAxixs = [];
List<double> yAxixs = [];
3 years ago
@override
Widget build(BuildContext context) {
getXaxix();
return AspectRatio(
aspectRatio: 1.1,
child: Container(
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(18)),
// color: Colors.white,
),
child: Stack(
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
const SizedBox(
height: 12,
),
Padding(
padding: const EdgeInsets.only(
left: 20,
right: 20,
),
child: Text(
3 years ago
title!,
3 years ago
style: TextStyle(
color: Colors.black,
fontSize: 16,
letterSpacing: -0.64,
fontWeight: FontWeight.w600,
),
textAlign: TextAlign.start,
),
),
SizedBox(
height: 10,
),
Expanded(
child: Padding(
padding: const EdgeInsets.only(right: 18.0, left: 16.0, top: 15),
child: LineChart(
sampleData1(context),
3 years ago
duration: const Duration(milliseconds: 250),
3 years ago
),
),
),
SizedBox(
height: 10,
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
children: [
Container(
width: 16,
height: 16,
decoration: containerRadius(Theme.of(context).primaryColor, 100),
),
SizedBox(
width: 5,
),
Text(
TranslationBase.of(context).systolicLng,
style: TextStyle(
color: Colors.black,
fontSize: 12,
letterSpacing: -0.64,
fontWeight: FontWeight.w600,
),
),
],
),
SizedBox(
width: 15,
),
Row(
children: [
Container(
width: 16,
height: 16,
1 month ago
decoration: containerRadius(Color(0xFF14384B), 100),
3 years ago
),
SizedBox(
width: 5,
),
Text(
TranslationBase.of(context).diastolicLng,
style: TextStyle(
color: Colors.black,
fontSize: 12,
letterSpacing: -0.64,
fontWeight: FontWeight.w600,
),
),
],
),
],
),
const SizedBox(
height: 12,
),
],
),
],
),
),
);
}
getXaxix() {
3 years ago
for (int index = 0; index < timeSeries1!.length; index++) {
int mIndex = indexes! * index;
if (mIndex < timeSeries1!.length) {
3 years ago
xAxixs.add(mIndex);
}
}
}
LineChartData sampleData1(context) {
return LineChartData(
lineTouchData: LineTouchData(
touchTooltipData: LineTouchTooltipData(
tooltipBgColor: Colors.white,
),
3 years ago
touchCallback: (touchEvent, LineTouchResponse? touchResponse) {},
3 years ago
handleBuiltInTouches: true,
),
gridData: FlGridData(show: true, drawVerticalLine: true, drawHorizontalLine: true, horizontalInterval: 14, verticalInterval: 14),
titlesData: FlTitlesData(
3 years ago
bottomTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
// rotateAngle: -65,
reservedSize: 22,
getTitlesWidget: (value, meta) {
if (timeSeries1!.length < 15) {
if (timeSeries1!.length > value.toInt()) {
return Text(
'${timeSeries1![value.toInt()].time.month}/ ${timeSeries1![value.toInt()].time.year}',
style: TextStyle(
color: Colors.black,
fontSize: 10,
),
);
} else
return Text("");
} else {
if (value.toInt() == 0)
return Text(
'${timeSeries1![value.toInt()].time.month}/ ${timeSeries1![value.toInt()].time.year}',
style: TextStyle(
color: Colors.black,
fontSize: 10,
),
);
if (value.toInt() == timeSeries1!.length - 1)
return Text(
'${timeSeries1![value.toInt()].time.month}/ ${timeSeries1![value.toInt()].time.year}',
style: TextStyle(
color: Colors.black,
fontSize: 10,
),
);
if (xAxixs.contains(value.toInt())) {
return Text(
'${timeSeries1![value.toInt()].time.month}/ ${timeSeries1![value.toInt()].time.year}',
style: TextStyle(
color: Colors.black,
fontSize: 10,
),
);
}
}
return Text("");
},
),
3 years ago
),
3 years ago
leftTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
interval: getMaxY() - getMinY() <= 500
? 50
: getMaxY() - getMinY() <= 1000
? 100
: 200,
reservedSize: 12,
),
)),
3 years ago
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,
3 years ago
maxX: (timeSeries1!.length - 1).toDouble(),
3 years ago
maxY: getMaxY() + 15,
minY: getMinY() - 15,
lineBarsData: getData(context),
);
}
double getMaxY() {
double max = 0;
3 years ago
timeSeries1!.forEach((element) {
double resultValueDouble = element.sales!;
3 years ago
if (resultValueDouble > max) max = resultValueDouble;
});
3 years ago
timeSeries2!.forEach((element) {
double resultValueDouble = element.sales!;
3 years ago
if (resultValueDouble > max) max = resultValueDouble;
});
return max.roundToDouble();
}
double getMinY() {
3 years ago
double min = timeSeries1![0].sales!;
timeSeries1!.forEach((element) {
double resultValueDouble = element.sales!;
3 years ago
if (resultValueDouble < min) min = resultValueDouble;
});
3 years ago
timeSeries2!.forEach((element) {
double resultValueDouble = element.sales!;
3 years ago
if (resultValueDouble < min) min = resultValueDouble;
});
int value = min.toInt();
return value.toDouble();
}
List<LineChartBarData> getData(context) {
3 years ago
List<FlSpot> spots = [];
for (int index = 0; index < timeSeries1!.length; index++) {
spots.add(FlSpot(index.toDouble(), timeSeries1![index].sales!));
3 years ago
}
3 years ago
List<FlSpot> spots2 = [];
for (int index = 0; index < timeSeries2!.length; index++) {
spots2.add(FlSpot(index.toDouble(), timeSeries2![index].sales!));
3 years ago
}
final LineChartBarData lineChartBarData1 = LineChartBarData(
spots: spots,
isCurved: true,
3 years ago
color: Colors.red,
3 years ago
barWidth: 1.5,
isStrokeCapRound: true,
dotData: FlDotData(
show: false,
),
belowBarData: BarAreaData(
show: false,
),
);
final LineChartBarData lineChartBarData2 = LineChartBarData(
spots: spots2,
isCurved: true,
3 years ago
color: Theme.of(context).primaryColor,
3 years ago
barWidth: 1.5,
isStrokeCapRound: true,
dotData: FlDotData(
show: false,
),
belowBarData: BarAreaData(
show: false,
),
);
return [lineChartBarData1, lineChartBarData2];
}
Decoration containerRadius(Color background, double radius) {
return BoxDecoration(
color: background,
border: Border.all(
width: 1, //
color: background // <--- border width here
3 years ago
),
3 years ago
borderRadius: BorderRadius.circular(radius),
);
}
}