Skip to content
Snippets Groups Projects
Commit 19dda40f authored by Madlen Ort's avatar Madlen Ort
Browse files

Weitergemacht

parent 0f7ba831
No related branches found
No related tags found
No related merge requests found
......@@ -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);
......
......@@ -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),
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,88 +261,75 @@ 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(
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(
style: GoogleFonts.cabin(fontSize: 20.0, color: Colors.grey.shade400,)),]),
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(
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,
child:Container(
width: 320,
decoration: BoxDecoration(
color: Colors.transparent,
border: Border.all(
color: color,
width: 1),
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,),),
),
child:
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) {
......@@ -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(
......
......@@ -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;
......
......@@ -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
......@@ -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),
......
......@@ -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"))
}
......@@ -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"
......@@ -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:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment