From 474eb13cfafe74c64a0ae9a3af5f68a403eca09e Mon Sep 17 00:00:00 2001 From: Daniel Cujba Date: Sun, 20 Nov 2022 06:33:51 +0200 Subject: [PATCH] Added a lot --- assets/images/blank-profile.jpg | Bin 0 -> 33760 bytes lib/main.dart | 583 +++++++++++++++--- lib/notifications.dart | 27 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 106 ++++ pubspec.yaml | 6 +- 6 files changed, 650 insertions(+), 74 deletions(-) create mode 100644 assets/images/blank-profile.jpg create mode 100644 lib/notifications.dart diff --git a/assets/images/blank-profile.jpg b/assets/images/blank-profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d7574258c401aeada1d22a0f4db93476db0db003 GIT binary patch literal 33760 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

dsb3K{x?aSxWR!$vzVxQ*8Ecj=4 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 l)$}O`{PleVYZ-fe;{D`-PagQ>flnUz { - int _counter = 0; - int _selectedIndex = 0; - int itemount = 0; + int _selectedIndex = 1; + int counter = 0; + bool _value = false; + int _completed_tasks = 10; + List tasks = []; + final tasks_progress = []; + int _total_tasks = 15; - final screens = [ - Center(child: Text('Targets')), - SpannableGrid( - cells: [ - SpannableGridCellData( - id: 1, - column: 1, - row: 1, - columnSpan: 2, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1)), + final screens = []; + + void set_total_tasks() { + _total_tasks = tasks.length; + } + + void onChanged(value) { + setState(() { + _value = value; + if (value) { + _completed_tasks += 1; + } else { + _completed_tasks -= 1; + } + }); + } + + void add_task(task_name, {goal = Null}) { + setState(() { + ; + Row task = Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + task_name, + style: TextStyle(color: Colors.black, fontSize: 20), + ) + ], + ); + + if (goal == Null) { + tasks_progress.add(false); + task.children.add(Checkbox(value: this._value, onChanged: onChanged)); + } else { + tasks_progress.add(0); + task.children.add(CircularPercentIndicator( + radius: 60.0, + lineWidth: 5.0, + percent: 1.0, + center: new Text("${tasks_progress[tasks_progress.length]}"), + progressColor: Colors.green, + )); + // task.children.add(); + } + Container t = 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: task, + ); + tasks.add(task); + }); + } + + void onPressed() { + setState(() { + _total_tasks += 1; + add_task("Name"); + }); + } + + void create_profile_page() { + setState(() { + screens.add( + 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( + 'Boss', + 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( + "Cats, Basketball, Guitar", + 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( + 'Achievements', + 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, + ), + ) + ], + )), + ], + ), + ))) + ], ), - SpannableGridCellData( - id: 2, - column: 1, - row: 2, - columnSpan: 2, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1))), - SpannableGridCellData( - id: 3, - column: 1, - row: 3, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1)), + ); + }); + } + + void create_targets_page() { + setState(() { + screens.add( + 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: ListView( + children: tasks, + )), + 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, ), - SpannableGridCellData( - id: 4, - column: 1, - row: 4, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1)), + ); + }); + } + + void create_home_page() { + setState(() { + screens.add( + SpannableGrid( + cells: [ + SpannableGridCellData( + id: 1, + column: 1, + row: 1, + columnSpan: 2, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1)), + ), + SpannableGridCellData( + id: 2, + column: 1, + row: 2, + columnSpan: 2, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1))), + SpannableGridCellData( + id: 3, + column: 1, + row: 3, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1)), + ), + SpannableGridCellData( + id: 4, + column: 1, + row: 4, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1)), + ), + SpannableGridCellData( + id: 5, + column: 2, + row: 3, + rowSpan: 2, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1)), + ), + ], + columns: 2, + rows: 4, + style: SpannableGridStyle( + spacing: 10, + ), ), - SpannableGridCellData( - id: 5, - column: 2, - row: 3, - rowSpan: 2, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1)), - ), - ], - columns: 2, - rows: 4, - style: SpannableGridStyle( - spacing: 10, - ), - ), - Center(child: Text('Profile')), - ]; + ); + }); + } void _onItemTapped(int index) { setState(() { @@ -96,21 +513,41 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: 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)) - ], - currentIndex: _selectedIndex, - onTap: _onItemTapped, - ), - ); + create_targets_page(); + create_home_page(); + 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)) + ], + currentIndex: _selectedIndex, + onTap: _onItemTapped, + ), + ), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.deepPurple, Colors.deepPurpleAccent], + ), + )); } } diff --git a/lib/notifications.dart b/lib/notifications.dart new file mode 100644 index 0000000..05afc88 --- /dev/null +++ b/lib/notifications.dart @@ -0,0 +1,27 @@ +import 'dart:math'; + +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + +final _localNotificationsPlugin = FlutterLocalNotificationsPlugin(); +final r = Random(4); + +Future setup() async { + const androidSetting = AndroidInitializationSettings('@mipmap/ic_launcher'); + const initSettings = InitializationSettings(android: androidSetting); + await _localNotificationsPlugin.initialize(initSettings).then((value) => {}); +} + +Future addNotification(title, body) async { + const androidDetail = + AndroidNotificationDetails("0", "Notifications", groupKey: "Key"); + + final id = r.nextInt(100000); + final noticeDetail = const NotificationDetails(android: androidDetail); + + await _localNotificationsPlugin.show( + id, + title, + body, + noticeDetail, + ); +} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..d2b4c55 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,8 @@ import FlutterMacOS import Foundation +import flutter_local_notifications func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 61ca4dc..c6a9a42 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" async: dependency: transitive description: @@ -43,6 +50,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" + dbus: + dependency: transitive + description: + name: dbus + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.8" fake_async: dependency: transitive description: @@ -50,6 +64,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.4" flutter: dependency: "direct main" description: flutter @@ -62,6 +90,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "12.0.3+1" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -102,6 +151,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + percent_indicator: + dependency: "direct main" + description: + name: percent_indicator + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.2" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" sky_engine: dependency: transitive description: flutter @@ -156,6 +240,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.12" + timezone: + dependency: transitive + description: + name: timezone + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.0" vector_math: dependency: transitive description: @@ -163,5 +254,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+2" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.0" sdks: dart: ">=2.18.4 <3.0.0" + flutter: ">=2.12.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1a73832..a8ab086 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,7 @@ version: 1.0.0+1 environment: sdk: '>=2.18.4 <3.0.0' + # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -37,6 +38,8 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 + flutter_local_notifications: ^12.0.3+1 + percent_indicator: ^4.2.2 dev_dependencies: flutter_test: @@ -54,7 +57,8 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - + assets: + - blank-profile.jpg # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class.