diff --git a/lib/classification/CustomSearchDelegate.dart b/lib/classification/CustomSearchDelegate.dart index 8fdb5bf7b91cd4bb51380ab8ee3f3f8281544ace..5a1ab2549cc4658cf4e5b0d86717edc93d552578 100644 --- a/lib/classification/CustomSearchDelegate.dart +++ b/lib/classification/CustomSearchDelegate.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import '../firebase.dart'; +//Suchleiste mit den Vorschlägen aller Genres aus Spotify + class CustomSearchDelegate extends SearchDelegate<String>{ String colorText; CustomSearchDelegate(this.colorText); diff --git a/lib/classification/classification.dart b/lib/classification/classification.dart index e0014df4014e61cc5dc938f6477b98500532c09f..e36ef1d13645c268b2b9a1803caaed7f2b3e4b1c 100644 --- a/lib/classification/classification.dart +++ b/lib/classification/classification.dart @@ -3,26 +3,28 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_custom_clippers/flutter_custom_clippers.dart'; import 'CustomSearchDelegate.dart'; import '../homepage.dart'; +import 'package:google_fonts/google_fonts.dart'; + +/* +Klasse & Screen zur Klassifizierung der Farben zu den Genres. +Es gibt eine graue Default Seite wenn keine Farbe ausgewählt ist. +Wenn eine Farbe ausgewählt wird, kann man das Genre dazu auswählen. +Die Klassifiezierung wird dann in der Datenbank aktualisiert + */ class ClassificationPage extends StatefulWidget { const ClassificationPage({Key? key}) : super(key: key); @override State<StatefulWidget> createState() => _ClassificationPageState(); - } class _ClassificationPageState extends State<ClassificationPage> { final String id = (FirebaseAuth.instance.currentUser?.uid.toString())!+'_genres'; - - - Color _ambientBackgroundColor = Colors.grey.withOpacity(0.5); - Color _ambientHeader = Colors.white; - + Color _ambientBackgroundColor = Colors.green; String genreValue = ''; bool _redSelected = false; @@ -46,24 +48,43 @@ class _ClassificationPageState extends State<ClassificationPage> { return Scaffold( resizeToAvoidBottomInset: false, body: Container( + color: _ambientBackgroundColor, child: Column( children: [ - ClipPath( - clipper: WaveClipperTwo(flip: true), - child: Container( - height: 140, - color: _ambientBackgroundColor, - child: Center( - child: Text( - 'Ambient!', - style: TextStyle( - fontSize: 40.0, color: _ambientHeader), - ), - ),),), - Expanded( - child: ListView( + const SizedBox(height: 40,), + SizedBox( height: 50, width: 300, + child: Text('Ambient!', + style: + GoogleFonts.cabin( + fontSize: 40.0, color: Colors.white.withOpacity(0.85)),),), + const SizedBox(height: 20,), + SizedBox( + height: 80, + width: 300, + child : Text('Select the genre that fits to the emotion of each color', + style: + GoogleFonts.cabin( + fontSize: 20.0, color: Colors.white.withOpacity(0.85),),),), + + Container( + height: 50, + decoration: BoxDecoration( + color: Color(0xffffffff), + borderRadius: BorderRadius.only(topLeft: Radius.circular(50),topRight: Radius.circular(50)), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 7, + offset: Offset(0, 3), + ), + ],) + ), + Expanded( + child: Container( + color: Color(0xffffffff), + child: ListView( children: <Widget>[ - const SizedBox(height: 20,), GestureDetector( onTap: (){ if(!_redSelected){closeAll(); setState(() => _redSelected = true); } @@ -72,7 +93,7 @@ class _ClassificationPageState extends State<ClassificationPage> { if (!_redSelected){_ambientBackgroundColor = Colors.grey.withOpacity(0.5);}}, child: Container( child: _redSelected ? - selectedColor("Red", Colors.red, Colors.white.withOpacity(0.7), + selectedColor("Red", Colors.red, Colors.white.withOpacity(0.9), "rock","latin", "blues", 'Starke Emotionen, Liebe, Energie') : noSelection("Red") ) @@ -86,7 +107,7 @@ class _ClassificationPageState extends State<ClassificationPage> { if (!_orangeSelected){_ambientBackgroundColor = Colors.grey.withOpacity(0.5);}}, child: Container( child: _orangeSelected ? - selectedColor("Orange", Colors.orange, Colors.white.withOpacity(0.7), + selectedColor("Orange", Colors.orange, Colors.white.withOpacity(0.9), "soul", "jazz", "Orange 3", 'Wärme, Energie, Herbst') : noSelection("Orange") ) ,), @@ -112,7 +133,7 @@ class _ClassificationPageState extends State<ClassificationPage> { if (!_greenSelected){_ambientBackgroundColor = Colors.grey.withOpacity(0.5);}}, child: Container( child: _greenSelected ? - selectedColor("Green", Colors.green, Colors.white.withOpacity(0.7), + selectedColor("Green", Colors.green, Colors.white.withOpacity(0.9), "ambient", "classical", "new-age", 'Ruhe, Wachstum, Natur') : noSelection("Green") ) ,), @@ -121,11 +142,11 @@ class _ClassificationPageState extends State<ClassificationPage> { onTap: (){ if(!_whiteSelected){closeAll(); setState(() => _whiteSelected = true); } else{closeAll();} - _ambientBackgroundColor = Colors.white60; + _ambientBackgroundColor = Colors.grey.withOpacity(0.5); if (!_whiteSelected){_ambientBackgroundColor = Colors.grey.withOpacity(0.5);}}, child: Container( child: _whiteSelected ? - selectedColor("White", Colors.white60, Colors.grey, + selectedColor("White", Colors.white, Colors.grey.withOpacity(0.7), "classical", "ambient", "piano", 'Reinheit, Frieden, Gelassenheit') : noSelection("White") ) ,), @@ -138,7 +159,7 @@ class _ClassificationPageState extends State<ClassificationPage> { if (!_blueSelected){_ambientBackgroundColor = Colors.grey.withOpacity(0.5);}}, child: Container( child: _blueSelected ? - selectedColor( "Blue", Colors.blue, Colors.white.withOpacity(0.7), + selectedColor( "Blue", Colors.blue, Colors.white.withOpacity(0.9), "blues", "rainy-day", "indie-pop", 'Ruhe, Gelassenheit, Traurigkeit') : noSelection("Blue") ) ,), @@ -152,7 +173,7 @@ class _ClassificationPageState extends State<ClassificationPage> { child: Container( child: _pinkSelected ? selectedColor( - "Pink", Colors.pink, Colors.white.withOpacity(0.7), + "Pink", Colors.pink, Colors.white.withOpacity(0.9), "pop", "k-pop", "r-n-b", 'Romantik, Anmut, Nostalgie') : noSelection("Pink") ) ,), @@ -165,7 +186,7 @@ class _ClassificationPageState extends State<ClassificationPage> { if (!_purpleSelected){_ambientBackgroundColor = Colors.grey.withOpacity(0.5);}}, child: Container( child: _purpleSelected ? - selectedColor("Purple", Colors.purple, Colors.white.withOpacity(0.7), + selectedColor("Purple", Colors.purple, Colors.white.withOpacity(0.9), "rock", "classical", "hip-hop", 'Luxus, Spiritualität, Ambition') : noSelection("Purple") ) ,), @@ -178,7 +199,7 @@ class _ClassificationPageState extends State<ClassificationPage> { if (!_brownSelected){_ambientBackgroundColor = Colors.grey.withOpacity(0.5);}}, child: Container( child: _brownSelected ? - selectedColor("Brown", Colors.brown, Colors.white.withOpacity(0.7), + selectedColor("Brown", Colors.brown, Colors.white.withOpacity(0.9), "country", "Brown2", "Brown3", 'info') : noSelection("Brown") ) ,), @@ -187,25 +208,28 @@ class _ClassificationPageState extends State<ClassificationPage> { onTap: () { if(!_blackSelected){closeAll(); setState(() => _blackSelected = true); } else{closeAll();} - _ambientBackgroundColor = Colors.black54; + _ambientBackgroundColor = Colors.black87; if (!_blackSelected){_ambientBackgroundColor = Colors.grey.withOpacity(0.5);}}, child: Container( child: _blackSelected ? - selectedColor("Black", Colors.black54, Colors.white.withOpacity(0.7), "Black1", "Black2", "Black3", 'info') : noSelection("Black") + selectedColor("Black", Colors.black87, Colors.white.withOpacity(0.7), "Black1", "Black2", "Black3", 'info') : noSelection("Black") ) ,), const SizedBox(height: 20,), - SizedBox( - width: 100, + Align( + alignment: Alignment.center, + child: Container( + width: 200, height: 40, child : StreamBuilder( + //Es wird in der Datenbank geprüft, ob zu allen Farben ein Genre ausgewählt wurde stream: FirebaseFirestore.instance.collection('classification').doc(id).snapshots(), builder: (BuildContext context, AsyncSnapshot snapshot) { return ElevatedButton( - style:ButtonStyle(backgroundColor: MaterialStatePropertyAll<Color>(Colors.white.withOpacity(0.9))), + style:ButtonStyle( + backgroundColor: MaterialStatePropertyAll<Color>(Colors.white.withOpacity(0.9))), child: const Text( - "Save", - style: TextStyle(color: Colors.indigo, fontWeight: FontWeight.bold),), + "Save", style: TextStyle(color: Colors.indigo, fontWeight: FontWeight.bold),), onPressed: () { print(changeFirebase().checkIfEverythingSelected(snapshot).toString()); if (changeFirebase().checkIfEverythingSelected(snapshot)) { @@ -217,7 +241,7 @@ class _ClassificationPageState extends State<ClassificationPage> { }); } }); - })), + }))), Container( child: _errorText ? const Text('Not everything is selected!', @@ -225,10 +249,8 @@ class _ClassificationPageState extends State<ClassificationPage> { style: TextStyle( fontSize: 20, color: Colors.red),) : null ), - SizedBox(height: 40,) - ]), - ), - ] + const SizedBox(height: 40,) + ]),),)] ) )); } @@ -239,89 +261,76 @@ class _ClassificationPageState extends State<ClassificationPage> { style: TextStyle(fontSize: 20, color: Colors.red) ); } + //wenn die Farbe nicht ausgewählt ist, wird kein Genre-Auswahl dargestellt und die Farben sind grau - Column noSelection(String colorText) { - return Column( - children: [ - Row( + Align noSelection(String colorText) { + return Align( + alignment: Alignment.center, + child:Container( + width: 320, + decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all( + color: Colors.grey.shade300, width: 1), + borderRadius: BorderRadius.circular(10),), + child: Column( + children: [ + SizedBox(height: 50,), + Row( children: [ - const SizedBox(width: 30, height: 50), + const SizedBox(width: 25), Text(colorText, - style: const TextStyle(fontSize: 30, color: Colors.grey)), - ] - ), - Align( - alignment: Alignment.center, - child: Row( - children: [ - const SizedBox(width: 30), - Container( - width: 340, - decoration: BoxDecoration( - color: Colors.transparent, - border: Border.all( - color: Colors.grey, - width: 1), - borderRadius: BorderRadius.circular(10), - ), - child: StreamBuilder( + style: GoogleFonts.cabin(fontSize: 20.0, color: Colors.grey.shade400,)),]), + Row( + children: [ + const SizedBox(width: 25), + StreamBuilder( stream: FirebaseFirestore.instance.collection('classification').doc(id).snapshots(), builder: (BuildContext context, AsyncSnapshot snapshot){ if (snapshot.connectionState == ConnectionState.waiting) { return const Center( - child: CircularProgressIndicator(), - ); - } - return - Text(changeFirebase().checkForNull(snapshot.data.data()[colorText]), textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20, color: Colors.grey),); - } - ) - ) - ] - ) - ) - ]); -} + child: CircularProgressIndicator(),);} + return Text(changeFirebase().checkForNull(snapshot.data.data()[colorText]), textAlign: TextAlign.center, + style: GoogleFonts.cabin(fontSize: 40.0, color: Colors.grey.shade400,),); + }),]), + SizedBox(height: 5,)])));} - Column selectedColor(String colorText, Color color, Color textColor, String rec1, String rec2, String rec3, String infoText) { - return Column( - children: [ - Row( - children: [ - const SizedBox(width: 30, height: 50), - Text(colorText, style: TextStyle(fontSize: 30, color: color)), - IconButton(onPressed:(){ - _showMyDialog(colorText, infoText); - }, - alignment: Alignment.centerRight, - icon: Icon( Icons.info_outline, color: color), - ), - ],), - selectedGenre(colorText, color, textColor, rec1, rec2, rec3), - ]); - } - Align selectedGenre(String colorText, Color color, Color textColor, String rec1, String rec2, - String rec3) { + //Wenn eine Farbe ausgewählt wird, werden die Farben entsprechend angepasst + //Und man kann ein Genre zu dieser Farbe auswählen + Align selectedColor(String colorText, Color color, Color textColor, String rec1, String rec2, String rec3, String infoText) { return Align( - alignment: Alignment.center, - child: Column( - children: [ - Row( - children: [ - const SizedBox(width: 30), - Container( - width: 340, - decoration: BoxDecoration( - color: Colors.transparent, - border: Border.all( - color: color, - width: 1), - borderRadius: BorderRadius.circular(10), - ), - child: - StreamBuilder( + alignment: Alignment.center, + child:Container( + width: 320, + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.4), + blurRadius: 10.0, + spreadRadius: 2.0, + offset: const Offset(0.0, 0.0),)]), + child: Column( + children: [ + Align( + alignment: Alignment.topRight, + child : IconButton(onPressed:(){ + _showMyDialog(colorText, infoText);}, + alignment: Alignment.centerRight, + icon: Icon( Icons.info_outline, color: textColor.withOpacity(0.7), size: 35,),), + ), + SizedBox(height: 0,), + Row( + children: [ + const SizedBox(width: 25), + Text(colorText, + style: GoogleFonts.cabin(fontSize: 20.0, color: textColor,)),]), + Row( + children: [ + const SizedBox(width: 25), + StreamBuilder( stream: FirebaseFirestore.instance.collection('classification').doc(id).snapshots(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { @@ -331,29 +340,10 @@ class _ClassificationPageState extends State<ClassificationPage> { } return Text(changeFirebase().checkForNull(snapshot.data.data()[colorText]), textAlign: TextAlign.center, - style: TextStyle(color: color, fontSize: 20),); + style: GoogleFonts.cabin(fontSize: 40.0, color: textColor),); } - ), - ) ] - ), - const SizedBox(height: 30), - Container( - width: 340, - // alignment: Alignment.center, - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.circular(10), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - blurRadius: 10.0, - spreadRadius: 2.0, - offset: const Offset(0.0, 0.0), - ) - ], - ), - child: Column( - children: [ + ),]), + const SizedBox(height: 20,), Container( width: 290, @@ -401,17 +391,14 @@ class _ClassificationPageState extends State<ClassificationPage> { ), const SizedBox(height: 50,) ] - ) - ] - ) - - ) - ])); - } + )]))); + } GestureDetector recommendationLabel(String colorText, String rec, Color textColor) { return GestureDetector( - onTap: () => changeFirebase().updateColorGenre(colorText, rec), + onTap: () { + changeFirebase().updateColorGenre(colorText, rec); + closeAll();}, child:Container( child: Row( children: [ @@ -429,12 +416,11 @@ class _ClassificationPageState extends State<ClassificationPage> { style: TextStyle(fontSize: 20, color: textColor) ), ) - )] - ) - ), + )])), ); } + //Info Dialog zur Erklärung der Farben-Emotionen Future<void> _showMyDialog(String colorText, String infoText) { return showDialog<void>( context: context, @@ -446,8 +432,7 @@ class _ClassificationPageState extends State<ClassificationPage> { child: ListBody( children: <Widget>[ Text(infoText), - ], - ), + ],), ), actions: <Widget>[ TextButton( diff --git a/lib/classification/color_widgets.dart b/lib/classification/color_widgets.dart deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/lib/loginRegister/login.dart b/lib/loginRegister/login.dart index e91eaa701a2cbdd4faaab1793aa8a6e1ebc55519..01e27dd772b94762616c1e94f788eaabab8f3874 100644 --- a/lib/loginRegister/login.dart +++ b/lib/loginRegister/login.dart @@ -8,6 +8,11 @@ import 'package:page_transition/page_transition.dart'; import '../homepage.dart'; +/* +Klasse zum Einloggen +Die Daten werden aus der Datenbank geholt +Entsprechende Fehlermeldungen werden abgefangen + */ class LoginPage extends StatefulWidget { const LoginPage({Key? key}) : super(key: key); @@ -61,9 +66,9 @@ class _LoginPageState extends State<LoginPage> { keyboardType: TextInputType.name, decoration: const InputDecoration( prefixIcon: Icon(Icons.person, color: Colors.white), - hintText: 'Username', + hintText: 'E-Mail', hintStyle: TextStyle(color: Colors.white), - labelText: 'Username', + labelText: 'E-Mail', labelStyle: TextStyle(color: Colors.white), ), ),), @@ -91,7 +96,7 @@ class _LoginPageState extends State<LoginPage> { FirebaseAuth.instance.signInWithEmailAndPassword( email: _emailTextController.text, password: _passwordTextController.text).then((value) { - Navigator.push(context, MaterialPageRoute(builder: (context)=>const HomePage())); + Navigator.push(context, MaterialPageRoute(builder: (context)=>const ClassificationPage())); }).onError((error, stackTrace){ setState(() { _wrongInput = true; diff --git a/lib/loginRegister/registration.dart b/lib/loginRegister/registration.dart index 986030bc61fa6c0454def5c88575487cae5db9e7..13573abd0d9766b43f0d4a922a514ed0ab043c99 100644 --- a/lib/loginRegister/registration.dart +++ b/lib/loginRegister/registration.dart @@ -4,10 +4,14 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import '../classification/classification.dart'; - import 'package:ambient/loginRegister/login.dart'; import 'package:page_transition/page_transition.dart'; +/* +Klasse zum Registrieren +Die User Daten werden in die Firebase Datenbank gespeichert +Fehlermeldungen beim Registrieren werden abgefangen + */ class RegistrationPage extends StatefulWidget { const RegistrationPage({Key? key}) : super(key: key); @@ -41,7 +45,6 @@ class _RegistrationPage extends State<RegistrationPage> { Scaffold( backgroundColor: Colors.transparent, - body: Center( child :Container( decoration: const BoxDecoration( @@ -53,7 +56,7 @@ class _RegistrationPage extends State<RegistrationPage> { const Expanded( child: Text( 'Ambient!', - style: TextStyle(fontSize: 60.0, color: Colors.white), + style: TextStyle(fontSize: 50.0, color: Colors.white), ),), Expanded( @@ -111,25 +114,27 @@ class _RegistrationPage extends State<RegistrationPage> { ), loginRegisterButton(context, false, () { - try{ FirebaseAuth.instance.createUserWithEmailAndPassword( email: _emailTextController.text, password: _passwordTextController.text).then((value){ createSetUp(); print ("Created new account"); Navigator.push(context, MaterialPageRoute(builder: (context)=>ClassificationPage())); - });} - on FirebaseAuthException catch(e){ - if(e.code == 'ERROR_EMAIL_ALREADY_IN_USE'){ + }).onError((error, stackTrace){ + String e = error.toString(); + print('Error 1 ' + error.toString()); + + if(error.toString().contains('email-already-in-use')){ + print("Email already in use"); setState(() { _infoText = 'Email already in use'; }); } - if(e.code == 'weak-password'){ + else if(error.toString().contains('weak-password')){ setState(() { _infoText = 'weak Password'; });} - if(e.code == 'invalid-email'){ + else if(error.toString().contains('invalid-email')){ setState(() { _infoText = 'invalid email'; });} @@ -139,7 +144,7 @@ class _RegistrationPage extends State<RegistrationPage> { }); } - }; + }); }), SizedBox(height: 20), loginPage(), @@ -177,13 +182,10 @@ class _RegistrationPage extends State<RegistrationPage> { ); } - Future addDisplayName() async{ - FirebaseAuth.instance.currentUser?.updateDisplayName(_usernameTextController.text); - } - + //Beim Anlegen eines Accounts werden auch die Farben angelegt, + //damit der User später die Genres zuordnen kann Future createSetUp() async{ - //final String id = '${FirebaseAuth.instance.currentUser?.uid.toString()}_genres'; final String id = (FirebaseAuth.instance.currentUser?.uid.toString())!+'_genres'; final user = FirebaseFirestore.instance.collection('classification').doc(id); @@ -200,6 +202,7 @@ class _RegistrationPage extends State<RegistrationPage> { 'Brown' : null, 'Black' : null, }; + print('set up'); await user.set(json); } } \ No newline at end of file diff --git a/lib/loginRegister/widgets.dart b/lib/loginRegister/widgets.dart index 7b8d4832be8a5e5b80ee1da8e1ea8f53334baba7..274933a349b8577e6d4dd3a0d1201aa587cf7132 100644 --- a/lib/loginRegister/widgets.dart +++ b/lib/loginRegister/widgets.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; import 'login.dart'; +//Widgets für den Login/Registrations Screen + Container loginRegisterButton( BuildContext context, bool isLogin, Function onTap) { return Container( @@ -71,7 +73,6 @@ Container signOutButton( //textWidth height: 10, child: Text( - text, style: const TextStyle( color: Colors.red), diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 804ef2fb66b2855eb00a5c3bca02f1783760fcd0..2597bfc5c8a5c36bcf9b84d317546039957f941f 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,9 +8,11 @@ import Foundation import cloud_firestore import firebase_auth import firebase_core +import path_provider_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index f310d036efa552703f9765212d2bbc3199cbfe09..425083e469b60c8d6d6e8b210f35b6a24d9608f9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -64,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.16.0" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -78,6 +85,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" firebase_auth: dependency: "direct main" description: @@ -149,6 +170,13 @@ packages: description: flutter source: sdk version: "0.0.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.3" google_nav_bar: dependency: "direct main" description: @@ -156,6 +184,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "5.0.6" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.5" http_parser: dependency: transitive description: @@ -219,6 +254,55 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.12" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.22" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.7" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" plugin_platform_interface: dependency: transitive description: @@ -226,6 +310,13 @@ packages: 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 @@ -287,6 +378,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+3" sdks: dart: ">=2.18.5 <3.0.0" - flutter: ">=1.20.0" + flutter: ">=3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 3bf4a83cd5cec6d478bc6db1e181241e10f04b3e..a1bae053775e2e1883e200268ef1efc7cfaabe18 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,7 @@ dependencies: page_transition: ^2.0.9 flutter_custom_clippers: ^2.1.0 cloud_firestore: ^4.3.0 + google_fonts: ^2.1.0 dev_dependencies: flutter_test: