import 'dart:ffi'; import 'package:flutter/material.dart'; import 'package:spannable_grid/spannable_grid.dart'; import 'package:percent_indicator/percent_indicator.dart'; import 'notifications.dart' as LocalNoticeService; import 'test.dart' as Tests; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await LocalNoticeService.setup(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Health Homie', theme: ThemeData( primarySwatch: Colors.blue, appBarTheme: AppBarTheme( backgroundColor: Colors.transparent, elevation: 0.0, centerTitle: true, titleTextStyle: TextStyle( color: Colors.white, fontSize: 30, ), )), home: const MyHomePage(title: 'Health Homie'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State createState() => _MyHomePageState(); } List data = [ ['Water', 'Drink at least 2L of water', 10, false], ['Instagram', 'Spend less time on instagram', 10, false], ['Sleep', 'Go to sleep at 10pm', 10, false], ['Exercises', 'Do 10 push-ups', 10, true], ['Walking', 'Walk at least 8000 steps', 10, false], ]; class TaskBox extends StatefulWidget { final taskName; final description; final limit; final isDone; const TaskBox({ super.key, required this.taskName, required this.description, required this.limit, required this.isDone, }); @override State createState() => _TaskBoxState(); } class _TaskBoxState extends State { @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15.0), child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(24), color: !widget.isDone ? Color.fromRGBO(235, 235, 235, 1) : Color.fromARGB(255, 149, 205, 85), ), child: Padding( padding: const EdgeInsets.symmetric(vertical: 25.0), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ Expanded( child: Column(children: [ Padding( padding: const EdgeInsets.only(left: 0), child: Text( widget.taskName, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 20, color: !widget.isDone ? Colors.black : Colors.black, ), ), ), SizedBox( height: 30, ), SizedBox( width: 100, child: Text( widget.description, style: TextStyle( fontWeight: FontWeight.normal, fontSize: 15, color: !widget.isDone ? Colors.black : Colors.black, ), )) ])) ], ), ], ), ), ), ); } } class _MyHomePageState extends State { int _selectedIndex = 1; int counter = 5; bool _value = false; int _completed_tasks = 1; List tasks = []; final tasks_progress = []; int _total_tasks = 5; int _water = 0; List screens = [ SpannableGrid( cells: [], rows: 1, columns: 1, ), SpannableGrid( cells: [], rows: 1, columns: 1, ), Stack() ]; void onPressed() { setState(() { TextEditingController nameField = new TextEditingController(); TextEditingController limitField = new TextEditingController(); TextEditingController descriptionField = new TextEditingController(); showDialog( context: context, builder: (ctx) => AlertDialog( title: const Text("Alert Dialog Box"), content: const Text("You have raised a Alert Dialog Box"), actions: [ TextField( controller: nameField, autofocus: true, decoration: new InputDecoration( labelText: 'Add a task', hintText: 'Task Name'), ), TextField( controller: limitField, autofocus: true, decoration: new InputDecoration(hintText: 'Task Limit'), ), TextField( autofocus: true, controller: descriptionField, decoration: new InputDecoration(hintText: 'Task Description'), ), TextButton( onPressed: () { setState(() { _total_tasks += 1; }); Navigator.of(ctx).pop(); data.add([ nameField.text, descriptionField.text, limitField.text, false ]); }, child: Container( color: Colors.deepPurple, padding: const EdgeInsets.all(14), child: const Text("okay"), ), ), ], )); }); } Stack create_profile_page() { return Stack( children: [ Column( children: [ Expanded( flex: 5, child: Container( width: double.infinity, height: 10, decoration: BoxDecoration( gradient: LinearGradient( colors: [Colors.deepPurple, Colors.deepPurpleAccent], ), ), child: Column(children: [ SizedBox( height: 80.0, ), CircleAvatar( radius: 65.0, foregroundImage: AssetImage("blank-profile.jpg"), backgroundColor: Colors.grey, ), SizedBox( height: 10.0, ), Text('Dumitrana Mihnea', style: TextStyle( color: Colors.white, fontSize: 20.0, )), Text( 'Experienced User', style: TextStyle( color: Colors.white, fontSize: 15.0, ), ) ]), ), ), Expanded( flex: 5, child: Container( color: Colors.grey[200], child: Center( child: Card( margin: EdgeInsets.fromLTRB(0.0, 45.0, 0.0, 10.0), child: Container( width: 310.0, height: 290.0, child: Padding( padding: EdgeInsets.all(10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( height: 60, ), Text( "Information", style: TextStyle( fontSize: 17.0, fontWeight: FontWeight.w800, ), ), Divider( color: Colors.grey[300], ), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ SizedBox( height: 20, ), Icon( Icons.fitness_center, color: Colors.blueAccent[400], size: 35, ), SizedBox( width: 20.0, ), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Body Type", style: TextStyle( fontSize: 15.0, ), ), Text( "Burly", style: TextStyle( fontSize: 12.0, color: Colors.grey[400], ), ) ], ) ], ), SizedBox( height: 20.0, ), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Icon( Icons.accessibility_new, color: Colors.yellowAccent[400], size: 35, ), SizedBox( width: 20.0, ), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Heigth", style: TextStyle( fontSize: 15.0, ), ), Text( "1.86 meters", style: TextStyle( fontSize: 12.0, color: Colors.grey[400], ), ) ], ) ], ), SizedBox( height: 20.0, ), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Icon( Icons.favorite, color: Colors.pinkAccent[400], size: 35, ), SizedBox( width: 20.0, ), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Vitals", style: TextStyle( fontSize: 15.0, ), ), Text( "Active lifestyle, Healthy BMI", style: TextStyle( fontSize: 12.0, color: Colors.grey[400], ), ) ], ) ], ), SizedBox( height: 10.0, ), ], )))), ), ), ) ], ), Positioned( top: MediaQuery.of(context).size.height * 0.45, left: 20.0, right: 20.0, child: Card( child: Padding( padding: EdgeInsets.all(16.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Container( child: Column( children: [ Text( 'Daily streak', style: TextStyle(color: Colors.grey[400], fontSize: 14.0), ), SizedBox( height: 5.0, ), Text( "$counter", style: TextStyle( fontSize: 15.0, ), ) ], )), Container( child: Column(children: [ Text( 'Birthday', style: TextStyle(color: Colors.grey[400], fontSize: 14.0), ), SizedBox( height: 5.0, ), Text( 'April 7th', style: TextStyle( fontSize: 15.0, ), ) ]), ), Container( child: Column( children: [ Text( 'Age', style: TextStyle(color: Colors.grey[400], fontSize: 14.0), ), SizedBox( height: 5.0, ), Text( '19 yrs', style: TextStyle( fontSize: 15.0, ), ) ], )), ], ), ))) ], ); } SpannableGrid create_targets_page() { return SpannableGrid( gridSize: SpannableGridSize.parent, cells: [ SpannableGridCellData( id: 1, column: 1, row: 1, child: Container( margin: EdgeInsets.fromLTRB(20, 20, 20, 0), padding: EdgeInsets.all(5), decoration: BoxDecoration( color: Color.fromRGBO(235, 235, 235, 1), borderRadius: BorderRadius.circular(8)), child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "Daily Tasks Completed $_completed_tasks/$_total_tasks", style: TextStyle(color: Colors.black, fontSize: 20), ), ], ))), SpannableGridCellData( id: 2, column: 1, row: 2, child: Container( margin: EdgeInsets.fromLTRB(10, 0, 20, 10), decoration: BoxDecoration(borderRadius: BorderRadius.circular(16)), child: LinearPercentIndicator( alignment: MainAxisAlignment.center, width: MediaQuery.of(context).size.width * 0.8, lineHeight: 20.0, animation: true, animationDuration: 2500, percent: _completed_tasks / _total_tasks, backgroundColor: Color.fromRGBO(235, 235, 235, 1), progressColor: Colors.deepPurpleAccent, barRadius: Radius.circular(16), ), ), ), SpannableGridCellData( id: 3, column: 1, row: 3, rowSpan: 7, child: GridView.builder( itemCount: data.length, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2), itemBuilder: (context, index) { return GestureDetector( onTap: () { // data[index][2] = !data[index][2]; // print(data[index][2]); }, child: TaskBox( taskName: data[index][0], description: data[index][1], limit: data[index][2], isDone: data[index][3]), ); }, )), SpannableGridCellData( id: 4, column: 1, row: 10, child: Container( margin: EdgeInsets.all(10), child: FloatingActionButton( onPressed: onPressed, child: Icon(Icons.add), foregroundColor: Colors.black, backgroundColor: Colors.white, ))) ], rows: 10, columns: 1, ); } SpannableGrid create_home_page() { return SpannableGrid( cells: [ SpannableGridCellData( id: 1, column: 1, row: 1, columnSpan: 4, rowSpan: 3, child: Container( decoration: BoxDecoration( border: Border.all( width: 5, color: Color.fromARGB(255, 115, 115, 130)), borderRadius: BorderRadius.all(Radius.circular(25)), color: Color.fromRGBO(240, 240, 240, 1)), child: SpannableGrid( cells: [ SpannableGridCellData( id: 5, column: 1, row: 1, columnSpan: 4, rowSpan: 2, child: Column( children: [ SizedBox( height: 20, ), Text( "Hello Dumi,", style: TextStyle( fontSize: 35, fontFamily: "Lato", color: Color.fromARGB(255, 0, 0, 0), fontWeight: FontWeight.w500, fontStyle: FontStyle.normal, ), ), SizedBox( height: 20, ), Text( "You're getting close\n to your steps goal!", style: TextStyle( fontSize: 35, color: Color.fromARGB(255, 0, 0, 0), fontStyle: FontStyle.normal, ), ) ], ), ), SpannableGridCellData( id: 7, column: 1, row: 3, columnSpan: 4, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( width: MediaQuery.of(context).size.width * 0.85, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("Steps\ncounter"), Text("Target\n 8k"), ], ), ), SizedBox( height: 15, ), SizedBox( child: LinearPercentIndicator( alignment: MainAxisAlignment.center, width: MediaQuery.of(context).size.width * 0.86, animation: true, lineHeight: 20.0, animationDuration: 1000, percent: 0.724, barRadius: const Radius.circular(16), center: Text("72.4%"), progressColor: Colors.deepPurple, ), ), ], )) ], columns: 4, rows: 3, style: SpannableGridStyle( spacing: 0, ), ))), SpannableGridCellData( id: 2, column: 1, row: 4, columnSpan: 2, rowSpan: 2, child: Container( decoration: BoxDecoration( border: Border.all( width: 5, color: Color.fromARGB(255, 115, 115, 130)), borderRadius: BorderRadius.all(Radius.circular(25)), color: Color.fromRGBO(240, 240, 240, 1)), child: Center( child: Flex( direction: Axis.vertical, children: [ Expanded( flex: 1, child: Container( child: Text( "\nScreen Time", style: TextStyle( color: Colors.black, fontSize: 25, fontWeight: FontWeight.w500), ), )), Expanded( flex: 1, child: Container( child: Flex( direction: Axis.vertical, children: [ new CircularPercentIndicator( radius: 35.0, lineWidth: 10.0, percent: 0.33, animateFromLastPercent: true, center: new Text( "8/6\nhrs", style: TextStyle( color: Colors.red, fontSize: 20, ), ), progressColor: Colors.red, backgroundColor: Colors.green, ) // Text( // " 8/6 hrs\nDaily limit\nexceeded", // style: TextStyle( // color: Colors.red, // fontSize: 20, // ), // ) ], ))), ], ))), ), SpannableGridCellData( id: 3, column: 3, row: 4, columnSpan: 2, rowSpan: 2, child: Container( decoration: BoxDecoration( border: Border.all( width: 5, color: Color.fromARGB(255, 115, 115, 130)), borderRadius: BorderRadius.all(Radius.circular(25)), color: Color.fromRGBO(240, 240, 240, 1)), alignment: Alignment.center, child: Flex( direction: Axis.vertical, children: [ Expanded( flex: 1, child: Center( child: Text( 'Daily Hydration', style: TextStyle(fontSize: 19), ))), Expanded( flex: 1, child: Center( child: Stack( children: [ LinearPercentIndicator( alignment: MainAxisAlignment.center, width: 160, animation: true, animateFromLastPercent: true, lineHeight: 35.0, animationDuration: 1000, percent: 0.1 * _water, progressColor: Color.fromARGB(255, 0, 141, 223), ), Image( image: AssetImage("paharPB.png"), ), ], ))), Expanded( flex: 1, child: Center( child: TextButton( style: ButtonStyle( foregroundColor: MaterialStateProperty.all( Colors.deepPurple), ), onPressed: () { setState( () { _water = _water + 1; if (_water == 10) { data[0][3] = true; _completed_tasks += 1; } }, ); }, // ignore: prefer_const_constructors child: Text( 'Drank some water!', style: TextStyle(fontSize: 15), ), ))) ], )), ), SpannableGridCellData( id: 4, column: 1, row: 6, rowSpan: 2, columnSpan: 4, child: Container( child: Center( child: Text( "Quote of the day\n\nā€œA healthy outside starts from the inside.ā€\n\n – Robert Urich – \n", style: TextStyle(fontStyle: FontStyle.italic, fontSize: 15), )), decoration: BoxDecoration( border: Border.all( width: 5, color: Color.fromARGB(255, 115, 115, 130)), borderRadius: BorderRadius.all(Radius.circular(25)), color: Color.fromRGBO(240, 240, 240, 1)), ), ), ], columns: 4, rows: 7, style: SpannableGridStyle( spacing: 10, ), ); } void _onItemTapped(int index) { setState(() { _selectedIndex = index; }); } @override Widget build(BuildContext context) { screens[0] = create_targets_page(); screens[1] = create_home_page(); screens[2] = create_profile_page(); return Container( child: Scaffold( backgroundColor: Colors.transparent, appBar: AppBar( title: Text(widget.title), flexibleSpace: Container( decoration: BoxDecoration( gradient: LinearGradient( colors: [Colors.deepPurple, Colors.deepPurpleAccent], ), ), ), ), body: Center( child: screens[_selectedIndex], ), bottomNavigationBar: BottomNavigationBar( items: const [ BottomNavigationBarItem( label: "Targets", icon: Icon(Icons.track_changes)), BottomNavigationBarItem(label: "Home", icon: Icon(Icons.home)), BottomNavigationBarItem( label: "Profile", icon: Icon(Icons.person)) ], selectedItemColor: Colors.deepPurple, currentIndex: _selectedIndex, onTap: _onItemTapped, ), ), decoration: BoxDecoration( gradient: LinearGradient( colors: [Colors.deepPurple, Colors.deepPurpleAccent], ), )); } }