import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_database/firebase_database.dart'; import 'package:flutter/material.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:rflutter_alert/rflutter_alert.dart'; import 'CircleProgress.dart'; import 'main.dart'; class Dashboard extends StatefulWidget { @override _DashboardState createState() => _DashboardState(); } class _DashboardState extends State with SingleTickerProviderStateMixin { bool isLoading = false; final GoogleSignIn googleSignIn = GoogleSignIn(); final databaseReference = FirebaseDatabase.instance.reference(); AnimationController progressController; Animation tempAnimation; Animation humidityAnimation; @override void initState() { super.initState(); databaseReference .child('ESP32_Device') .once() .then((DataSnapshot snapshot) { double temp = snapshot.value['Temperature']['Data']; double humidity = snapshot.value['Humidity']['Data']; isLoading = true; _DashboardInit(temp, humidity); }); } _DashboardInit(double temp, double humid) { progressController = AnimationController( vsync: this, duration: Duration(milliseconds: 5000)); //5s tempAnimation = Tween(begin: -50, end: temp).animate(progressController) ..addListener(() { setState(() {}); }); humidityAnimation = Tween(begin: 0, end: humid).animate(progressController) ..addListener(() { setState(() {}); }); progressController.forward(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Dashboard'), centerTitle: true, automaticallyImplyLeading: false, leading: new IconButton( icon: Icon(Icons.reorder), onPressed: handleLoginOutPopup), ), body: Center( child: isLoading ? Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ CustomPaint( foregroundPainter: CircleProgress(tempAnimation.value, true), child: Container( width: 200, height: 200, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Temperature'), Text( '${tempAnimation.value.toInt()}', style: TextStyle( fontSize: 50, fontWeight: FontWeight.bold), ), Text( '°C', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold), ), ], ), ), ), ), CustomPaint( foregroundPainter: CircleProgress(humidityAnimation.value, false), child: Container( width: 200, height: 200, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Humidity'), Text( '${humidityAnimation.value.toInt()}', style: TextStyle( fontSize: 50, fontWeight: FontWeight.bold), ), Text( '%', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold), ), ], ), ), ), ) ], ) : Text( 'Loading...', style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold), )), ); } handleLoginOutPopup() { Alert( context: context, type: AlertType.info, title: "Login Out", desc: "Do you want to login out now?", buttons: [ DialogButton( child: Text( "No", style: TextStyle(color: Colors.white, fontSize: 20), ), onPressed: () => Navigator.pop(context), color: Colors.teal, ), DialogButton( child: Text( "Yes", style: TextStyle(color: Colors.white, fontSize: 20), ), onPressed: handleSignOut, color: Colors.teal, ) ], ).show(); } Future handleSignOut() async { this.setState(() { isLoading = true; }); await FirebaseAuth.instance.signOut(); await googleSignIn.signOut(); this.setState(() { isLoading = false; }); Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => MyApp()), (Route route) => false); } }