From b55681a05658c0a41190e50251230400ec6ca106 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 9 Dec 2020 17:01:56 +0300 Subject: [PATCH] Working on steps tracking --- assets/images/new-design/view_more.png | Bin 0 -> 6069 bytes .../SmartWatch/YearlyStepsResModel.dart | 36 ++++ .../smart_watch_health_data/stepsTracker.dart | 171 +++++++++++++++++- 3 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 assets/images/new-design/view_more.png create mode 100644 lib/models/SmartWatch/YearlyStepsResModel.dart diff --git a/assets/images/new-design/view_more.png b/assets/images/new-design/view_more.png new file mode 100644 index 0000000000000000000000000000000000000000..8b52a7e71c8b9693382313dcf4f14489bf57367a GIT binary patch literal 6069 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 json) { + valueSum = json['ValueSum']; + medCategoryID = json['MedCategoryID']; + month = json['Month']; + monthName = json['MonthName']; + patientID = json['PatientID']; + year = json['Year']; + } + + Map toJson() { + final Map data = new Map(); + data['ValueSum'] = this.valueSum; + data['MedCategoryID'] = this.medCategoryID; + data['Month'] = this.month; + data['MonthName'] = this.monthName; + data['PatientID'] = this.patientID; + data['Year'] = this.year; + return data; + } +} diff --git a/lib/pages/medical/smart_watch_health_data/stepsTracker.dart b/lib/pages/medical/smart_watch_health_data/stepsTracker.dart index eec41a35..467242e8 100644 --- a/lib/pages/medical/smart_watch_health_data/stepsTracker.dart +++ b/lib/pages/medical/smart_watch_health_data/stepsTracker.dart @@ -1,7 +1,9 @@ +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:diplomaticquarterapp/models/SmartWatch/YearlyStepsResModel.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; -import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; @@ -14,6 +16,19 @@ class _StepsTrackerState extends State with SingleTickerProviderStateMixin { TabController _tabController; + int weeklyStatsAvgValue = 0; + int monthlyStatsAvgValue = 0; + int yearlyStatsAvgValue = 0; + + int avgStepsValue = 0; + int dataLength = 0; + + List yearlyStepsList = List(); + + List yearlyTimeSeriesData = []; + + bool isDataLoaded = false; + @override void initState() { _tabController = new TabController(length: 3, vsync: this); @@ -31,7 +46,7 @@ class _StepsTrackerState extends State isShowDecPage: false, body: Container( child: Column( - mainAxisSize: MainAxisSize.max, + mainAxisSize: MainAxisSize.min, children: [ TabBar( tabs: [ @@ -45,9 +60,9 @@ class _StepsTrackerState extends State child: new TabBarView( physics: NeverScrollableScrollPhysics(), children: [ - getWeeklyStepsDetails(), - getMonthlyStepsDetails(), - getYearlyStepsDetails() + isDataLoaded ? getWeeklyStepsDetails() : Container(), + isDataLoaded ? getMonthlyStepsDetails() : Container(), + isDataLoaded ? getYearlyStepsDetails() : Container() ], controller: _tabController, ), @@ -59,18 +74,66 @@ class _StepsTrackerState extends State } getYearlyStepsData() { + avgStepsValue = 0; + dataLength = 0; + DoctorsListService service = new DoctorsListService(); GifLoaderDialogUtils.showMyDialog(context); service.getPatientHealthDataStats(6, 3, context).then((res) { GifLoaderDialogUtils.hideDialog(context); print(res['Med_GetYearStepsTransactionsStsList']); + yearlyStepsList.clear(); + res['Med_GetYearStepsTransactionsStsList'].forEach((element) { + yearlyStepsList.add(new YearlyStepsResModel.fromJson(element)); + if (element['ValueSum'] != null) { + double value = element['ValueSum']; + avgStepsValue += value.toInt(); + dataLength++; + } + }); + + print(avgStepsValue); + print(dataLength); + setState(() { + yearlyStatsAvgValue = avgStepsValue ~/ dataLength; + isDataLoaded = true; + }); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); - AppToast.showErrorToast(message: err); + // AppToast.showErrorToast(message: err); print(err); }); } + generateData() { + if (yearlyStepsList.length > 0) { + yearlyTimeSeriesData.clear(); + yearlyStepsList.forEach( + (element) { + yearlyTimeSeriesData.add( + TimeSeriesSales( + new DateTime(element.year, element.month, 1), + element.valueSum != null ? element.valueSum.toInt() : 0, + ), + ); + }, + ); + yearlyTimeSeriesData.forEach((element) { + print(element.sales); + print(element.time); + }); + } + return [ + new charts.Series( + id: 'Sales', + colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, + domainFn: (TimeSeriesSales sales, _) => sales.time, + measureFn: (TimeSeriesSales sales, _) => sales.sales, + data: yearlyTimeSeriesData, + ) + ]; + } + getWeeklyStepsDetails() { return Container( child: Text("Weekly"), @@ -85,7 +148,101 @@ class _StepsTrackerState extends State getYearlyStepsDetails() { return Container( - child: Text("Yearly"), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: AppTimeSeriesChart( + seriesList: generateData(), + chartName: "Steps", + startDate: DateTime( + yearlyStepsList[0].year, yearlyStepsList[0].month, 1), + endDate: DateTime( + yearlyStepsList[yearlyStepsList.length - 1].year, + yearlyStepsList[yearlyStepsList.length - 1].month, + 1), + ), + ), + Container( + margin: EdgeInsets.only(top: 5.0), + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide(color: Colors.grey[400], width: 0.6)), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.fromLTRB(30.0, 15.0, 30.0, 15.0), + child: + Text("Average Steps", style: TextStyle(fontSize: 18.0)), + ), + Container( + margin: EdgeInsets.only(bottom: 10.0), + child: Text(yearlyStatsAvgValue.toString() + " Steps", + style: TextStyle( + fontSize: 20.0, fontWeight: FontWeight.bold)), + ), + ], + ), + ), + ), + Container( + margin: EdgeInsets.all(10.0), + child: Divider( + color: Colors.grey[500], + ), + ), + Container( + transform: Matrix4.translationValues(0.0, -10.0, 0.0), + margin: EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 5.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("History", style: TextStyle(fontSize: 14.0)), + Row( + children: [ + Text("view more", style: TextStyle(fontSize: 14.0)), + Container( + margin: EdgeInsets.only(left: 3.0, right: 3.0), + transform: Matrix4.translationValues(0.0, 1.5, 0.0), + width: 30.0, + height: 30.0, + child: Image.asset( + "assets/images/new-design/view_more.png", + fit: BoxFit.contain), + ), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 5.0), + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide(color: Colors.grey[400], width: 0.6)), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.fromLTRB(30.0, 15.0, 30.0, 15.0), + child: Text("Date", + style: TextStyle( + fontSize: 18.0, fontWeight: FontWeight.bold)), + ), + Container( + padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), + child: Text("Steps", style: TextStyle(fontSize: 18.0)), + ), + ], + ), + ), + ), + ], + ), ); } }