Advertisement
Guest User

Untitled

a guest
Nov 24th, 2020
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 7.97 KB | None | 0 0
  1. import 'package:dotted_line/dotted_line.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:intl/intl.dart';
  4. import 'package:lifetizr/misc/utils.dart';
  5. import 'package:lifetizr/ui/screens/homepage/homepage_viewmodel.dart';
  6. import 'package:lifetizr/ui/widgets/activity_block_preview.dart';
  7. import 'package:stacked/stacked.dart';
  8. import 'package:syncfusion_flutter_charts/charts.dart';
  9. import 'package:theme_provider/theme_provider.dart';
  10.  
  11. class ChartBlock extends StatefulWidget {
  12.   @override
  13.   _ChartBlockState createState() => _ChartBlockState();
  14. }
  15.  
  16. class _ChartBlockState extends State<ChartBlock> {
  17.   List<_DataPoint> graphData = [];
  18.  
  19.   @override
  20.   void initState() {
  21.     super.initState();
  22.     loadData();
  23.   }
  24.  
  25.   void loadData() async {
  26.     await HomepageViewModel().getGraphData().then(
  27.       (value) {
  28.         List<_DataPoint> tmpData = [];
  29.  
  30.         tmpData.add(_DataPoint(DateTime.fromMillisecondsSinceEpoch(0).toString(), 290));
  31.  
  32.         for (var item in value['allBloodglucoses']['edges']) {
  33.           tmpData.add(_DataPoint(
  34.               item['node']['timestamp'], item['node']['bloodGlucose']));
  35.         }
  36.  
  37.         setState(
  38.           () {
  39.             graphData = tmpData;
  40.           },
  41.         );
  42.       },
  43.     );
  44.   }
  45.  
  46.   @override
  47.   Widget build(BuildContext context) {
  48.     final controller = ThemeProvider.controllerOf(context);
  49.  
  50.     return ViewModelBuilder<HomepageViewModel>.reactive(
  51.       viewModelBuilder: () => HomepageViewModel(),
  52.       builder: (context, model, child) {
  53.         return SfCartesianChart(
  54.           trackballBehavior: TrackballBehavior(
  55.               lineWidth: 5,
  56.               lineColor: reverseColorGrabber(controller),
  57.               lineType: TrackballLineType.vertical,
  58.               enable: true,
  59.               shouldAlwaysShow: true,
  60.               tooltipAlignment: ChartAlignment.far,
  61.               tooltipSettings: InteractiveTooltip(
  62.                 arrowWidth: 0,
  63.                 arrowLength: 0,
  64.                 borderColor: reverseColorGrabber(controller),
  65.                 borderRadius: 15,
  66.                 borderWidth: 15,
  67.                 connectorLineWidth: 50,
  68.                 format: 'point.y mg/dL',
  69.                 enable: true,
  70.                 color: reverseColorGrabber(controller),
  71.               )),
  72.           primaryXAxis: CategoryAxis(
  73.               visibleMinimum: 0,
  74.               visibleMaximum: graphData.length.toDouble() / 6),
  75.           zoomPanBehavior: ZoomPanBehavior(
  76.             enablePanning: true,
  77.           ),
  78.           indicators: [],
  79.           // Enable tooltip
  80.           tooltipBehavior: TooltipBehavior(
  81.             color: Colors.transparent,
  82.             canShowMarker: false,
  83.             enable: true,
  84.             builder: (dynamic d, dynamic f, dynamic g, int i, int j) {
  85.               if (i == 1 || i == 4 || i == 3)
  86.                 return Container(
  87.                   height: 100,
  88.                   child: Column(
  89.                     mainAxisAlignment: MainAxisAlignment.end,
  90.                     children: [
  91.                       Container(
  92.                         padding: EdgeInsets.all(5),
  93.                         decoration: BoxDecoration(
  94.                           borderRadius: BorderRadius.circular(25),
  95.                           color: Colors.green,
  96.                         ),
  97.                         child: InkWell(
  98.                           onTap: () {
  99.                             print("Pressed");
  100.                           },
  101.                           child: Container(
  102.                               width: 80,
  103.                               child: ActivityBlockPreview(
  104.                                 score: 18,
  105.                                 pictureUrl: "https://i.imgur.com/nlRr5vn.jpeg",
  106.                               )),
  107.                         ),
  108.                       ),
  109.                       Expanded(
  110.                         child: DottedLine(
  111.                           direction: Axis.vertical,
  112.                           lineLength: double.infinity,
  113.                           lineThickness: 1.0,
  114.                           dashLength: 4.0,
  115.                           dashColor: reverseColorGrabber(controller),
  116.                           dashRadius: 0.0,
  117.                           dashGapLength: 4.0,
  118.                           dashGapColor: Colors.transparent,
  119.                           dashGapRadius: 0.0,
  120.                         ),
  121.                       ),
  122.                     ],
  123.                   ),
  124.                 );
  125.               else
  126.                 return null;
  127.             },
  128.           ),
  129.           series: <ChartSeries<_DataPoint, String>>[
  130.             SplineSeries<_DataPoint, String>(
  131.               color: reverseColorGrabber(controller),
  132.               width: 5,
  133.               pointColorMapper: (_DataPoint data, int i) {
  134.                 if (i == 0) return Colors.transparent;
  135.               },
  136.               dataSource: <_DataPoint>[...graphData],
  137.               xValueMapper: (_DataPoint point, _) =>
  138.                   DateFormat('H:mm').format(DateTime.parse(point.timestamp)),
  139.               yValueMapper: (_DataPoint point, _) => point.glucose,
  140.               // Enable data label
  141.               dataLabelSettings: DataLabelSettings(
  142.                 isVisible: true,
  143.                 labelAlignment: ChartDataLabelAlignment.top,
  144.                 builder: (dynamic d, dynamic f, dynamic g, int i, int _) {
  145.                   if (i == 1 || i == 4)
  146.                     return Container(
  147.                       height: 20,
  148.                       width: 20,
  149.                       decoration: BoxDecoration(
  150.                         borderRadius: BorderRadius.circular(30),
  151.                         border: Border.all(width: 3, color: Colors.red),
  152.                         color: Colors.white,
  153.                       ),
  154.                     );
  155.                   if (i == 3) {
  156.                     return Text(
  157.                       "🏀",
  158.                       style: TextStyle(fontSize: 20),
  159.                     );
  160.                   } else
  161.                     return null;
  162.                 },
  163.               ),
  164.             )
  165.           ],
  166.         );
  167.       },
  168.     );
  169.   }
  170. }
  171.  
  172. class _DataPoint {
  173.   _DataPoint(this.timestamp, this.glucose);
  174.  
  175.   final String timestamp;
  176.   final double glucose;
  177. }
  178.  
  179.  
  180. class ActivityBlockPreview extends StatefulWidget {
  181.   final int score;
  182.   final String pictureUrl;
  183.   final bool isSportActivity;
  184.   final bool isSleepActivity;
  185.   final String sportEmoji;
  186.  
  187.   const ActivityBlockPreview(
  188.       {this.score,
  189.       this.pictureUrl,
  190.       this.isSportActivity = false,
  191.       this.isSleepActivity = false,
  192.       this.sportEmoji});
  193.  
  194.   @override
  195.   _ActivityBlockPreviewState createState() => _ActivityBlockPreviewState();
  196. }
  197.  
  198. class _ActivityBlockPreviewState extends State<ActivityBlockPreview> {
  199.   @override
  200.   Widget build(BuildContext context) {
  201.     var controller = ThemeProvider.controllerOf(context);
  202.  
  203.     return Container(
  204.       decoration: BoxDecoration(
  205.           color: colorGrabber(controller),
  206.           borderRadius: BorderRadius.circular(60)),
  207.       child: Row(
  208.         mainAxisAlignment: MainAxisAlignment.start,
  209.         children: [
  210.           CircleAvatar(
  211.             backgroundColor: colorGrabber(controller),
  212.             backgroundImage: widget.isSportActivity == false &&
  213.                     widget.isSleepActivity == false
  214.                 ? NetworkImage(
  215.                     widget.pictureUrl,
  216.                   )
  217.                 : null,
  218.             child: widget.isSportActivity == true || widget.isSleepActivity
  219.                 ? Text(widget.sportEmoji)
  220.                 : Container(),
  221.           ),
  222.           if (!widget.isSportActivity)
  223.             Padding(
  224.               padding: const EdgeInsets.only(left: 5, right: 10),
  225.               child: Text(
  226.                 widget.score.toString(),
  227.                 style: TextStyle(
  228.                   fontSize: 20,
  229.                   fontWeight: FontWeight.bold,
  230.                 ),
  231.               ),
  232.             )
  233.         ],
  234.       ),
  235.     );
  236.   }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement