From aeef64a10909a0dcca9b481a4dbd7ceabc051307 Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Thu, 13 Apr 2023 16:51:29 +0200 Subject: [PATCH] firebase issue list working :O --- android/app/build.gradle | 3 +- android/app/google-services.json | 46 ++++++++++ ios/Runner/GoogleService-Info.plist | 34 +++++++ ios/firebase_app_id_file.json | 7 ++ lib/AddPage.dart | 33 ++++++- lib/UserDefinedList.dart | 6 +- lib/firebase_options.dart | 76 ++++++++++++++++ lib/main.dart | 12 ++- pubspec.lock | 134 +++++++++++++++++++++++++--- pubspec.yaml | 4 + 10 files changed, 336 insertions(+), 19 deletions(-) create mode 100644 android/app/google-services.json create mode 100644 ios/Runner/GoogleService-Info.plist create mode 100644 ios/firebase_app_id_file.json create mode 100644 lib/firebase_options.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 993c251..b2c4977 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -47,10 +47,11 @@ android { applicationId "com.example.demoapp" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. - minSdkVersion flutter.minSdkVersion + minSdkVersion 19 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName + multiDexEnabled true } buildTypes { diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..e9032e0 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,46 @@ +{ + "project_info": { + "project_number": "576683162451", + "project_id": "gemeinde-trommler", + "storage_bucket": "gemeinde-trommler.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:576683162451:android:b792a81fceafa932083fa6", + "android_client_info": { + "package_name": "com.example.demoapp" + } + }, + "oauth_client": [ + { + "client_id": "576683162451-pl7mb5k00rj5dhg3krqcqh8bpvn8ijbq.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAWjSjX1f2rGUGHLbXQS873DYY_oXqcHhs" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "576683162451-pl7mb5k00rj5dhg3krqcqh8bpvn8ijbq.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "576683162451-vf1g0qoge66lb3bmpsg4neckv4opovub.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.example.demoapp" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..5ef6bbd --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,34 @@ + + + + + CLIENT_ID + 576683162451-vf1g0qoge66lb3bmpsg4neckv4opovub.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.576683162451-vf1g0qoge66lb3bmpsg4neckv4opovub + API_KEY + AIzaSyDV441PhkPEC7igZmYMpJ_axLMc2bKQ5fY + GCM_SENDER_ID + 576683162451 + PLIST_VERSION + 1 + BUNDLE_ID + com.example.demoapp + PROJECT_ID + gemeinde-trommler + STORAGE_BUCKET + gemeinde-trommler.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:576683162451:ios:2fd841a4b4ca70d5083fa6 + + \ No newline at end of file diff --git a/ios/firebase_app_id_file.json b/ios/firebase_app_id_file.json new file mode 100644 index 0000000..2f82506 --- /dev/null +++ b/ios/firebase_app_id_file.json @@ -0,0 +1,7 @@ +{ + "file_generated_by": "FlutterFire CLI", + "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", + "GOOGLE_APP_ID": "1:576683162451:ios:2fd841a4b4ca70d5083fa6", + "FIREBASE_PROJECT_ID": "gemeinde-trommler", + "GCM_SENDER_ID": "576683162451" +} \ No newline at end of file diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 422d66d..7049861 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -1,7 +1,10 @@ import 'dart:io'; +import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; + class AddScreen extends StatefulWidget { @override @@ -24,6 +27,23 @@ class _AddScreenState extends State { } } + + Future addNewElementToFirestore(String title, String description, File imageFile) async { + // Zunächst das Bild in Firebase Storage speichern + Reference ref = FirebaseStorage.instance.ref().child("images/${DateTime.now().toString()}"); + UploadTask uploadTask = ref.putFile(imageFile); + String imageUrl = await (await uploadTask).ref.getDownloadURL(); + + // Das neue Element in der Firestore-Sammlung "Issues" speichern + await FirebaseFirestore.instance.collection("Issues").add({ + "title": title, + "description": description, + "imageUrl": imageUrl, + "createdDate": DateTime.now(), + }); + } + + @override Widget build(BuildContext context) { return Scaffold( @@ -47,10 +67,15 @@ class _AddScreenState extends State { padding: const EdgeInsets.only(right: 8.0), child: IconButton( icon: Icon(Icons.check), - onPressed: () { - if (_formKey.currentState!.validate()) { - // Hier wird die Logik zum Hinzufügen des neuen Elements ausgeführt - Navigator.pop(context); + onPressed: () async { + if (_formKey.currentState!.validate() && _imageFile != null) { + try { + await addNewElementToFirestore(_titleController.text, _descriptionController.text, _imageFile!); + Navigator.pop(context); + } catch (e) { + print(e); + // Fehlerbehandlung hier + } } }, ), diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index 2b44801..beca511 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -1,18 +1,20 @@ import 'package:flutter/material.dart'; - +import 'package:cloud_firestore/cloud_firestore.dart'; import 'DetailPage.dart'; + + class UserDefinedItem extends StatelessWidget { final String title; final String description; final Image? image; + const UserDefinedItem({super.key, required this.title, required this.description, this.image, }); - @override Widget build(BuildContext context) { String shortDescription = "${description.substring(0, 30)}..."; diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 0000000..76b0ef2 --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,76 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyBmdRrWkqosCAtlOeqs-G-4oWAvwLt3KnQ', + appId: '1:576683162451:web:71c67b5ef44ab7c1083fa6', + messagingSenderId: '576683162451', + projectId: 'gemeinde-trommler', + authDomain: 'gemeinde-trommler.firebaseapp.com', + storageBucket: 'gemeinde-trommler.appspot.com', + measurementId: 'G-ZH37BQ8679', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyAWjSjX1f2rGUGHLbXQS873DYY_oXqcHhs', + appId: '1:576683162451:android:b792a81fceafa932083fa6', + messagingSenderId: '576683162451', + projectId: 'gemeinde-trommler', + storageBucket: 'gemeinde-trommler.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDV441PhkPEC7igZmYMpJ_axLMc2bKQ5fY', + appId: '1:576683162451:ios:2fd841a4b4ca70d5083fa6', + messagingSenderId: '576683162451', + projectId: 'gemeinde-trommler', + storageBucket: 'gemeinde-trommler.appspot.com', + iosClientId: '576683162451-vf1g0qoge66lb3bmpsg4neckv4opovub.apps.googleusercontent.com', + iosBundleId: 'com.example.demoapp', + ); +} diff --git a/lib/main.dart b/lib/main.dart index f297fd7..6a451e2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,9 +2,19 @@ import 'package:flutter/material.dart'; import 'home.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'firebase_options.dart'; -void main() { +// ... + + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); runApp(const MyApp()); + } class MyApp extends StatelessWidget { diff --git a/pubspec.lock b/pubspec.lock index b8d192d..110783f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: f175bc1414e4edf8c5b83372c98eeabecf8353f39c9da423c2cfdf1f1f508788 + url: "https://pub.dev" + source: hosted + version: "1.1.0" async: dependency: transitive description: @@ -33,6 +41,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore + sha256: f5431cf41ab5c5e9c64e03ac2af103e10be22bf89020f394130c04b81add0010 + url: "https://pub.dev" + source: hosted + version: "4.5.1" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + sha256: "29349a0687bc31290ab81d1de2b1cdadb40d0ea3ab30d247323c6c5be0d4c6fc" + url: "https://pub.dev" + source: hosted + version: "5.12.0" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + sha256: "228f1944fb3c61ddf5de3647ec5b6ed88d6aacb0a4d485ef597c1211fe98ef8b" + url: "https://pub.dev" + source: hosted + version: "3.4.1" collection: dependency: transitive description: @@ -65,6 +97,78 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + sha256: e5254a39daab8c5bc76b17f5a161c11a7a97a3718cd314f460e2b4366c850c7d + url: "https://pub.dev" + source: hosted + version: "4.4.1" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: "5d5f283517ba34afd69ef448cc81ea23bcf8887393bedae4f70f45060b045fb9" + url: "https://pub.dev" + source: hosted + version: "6.13.0" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: c631ec90d05c990fe971774ff12e96ee88fc3dd22839d5cab3b04c8693859116 + url: "https://pub.dev" + source: hosted + version: "5.3.1" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: ed611fb8e67e43ecc7956f242cecca383d87cf71aace27287aa5dd4bdba4ac07 + url: "https://pub.dev" + source: hosted + version: "2.9.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "0df0a064ab0cad7f8836291ca6f3272edd7b83ad5b3540478ee46a0849d8022b" + url: "https://pub.dev" + source: hosted + version: "4.6.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: "347351a8f0518f3343d79a9a0690fa67ad232fc32e2ea270677791949eac792b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + firebase_storage: + dependency: "direct main" + description: + name: firebase_storage + sha256: a27909491c25acef90acc932be4d87bafb9d33fb98678edd2f81eaec9568a109 + url: "https://pub.dev" + source: hosted + version: "11.1.0" + firebase_storage_platform_interface: + dependency: transitive + description: + name: firebase_storage_platform_interface + sha256: f254e064890df4ee588f10bea06d679e047018910451a4bc3c529b9791adb0a9 + url: "https://pub.dev" + source: hosted + version: "4.2.0" + firebase_storage_web: + dependency: transitive + description: + name: firebase_storage_web + sha256: b6d3c104fecafdce5fe1795306d33856c9a11fa76f73fe7eb062430fc151d686 + url: "https://pub.dev" + source: hosted + version: "3.4.0" flutter: dependency: "direct main" description: flutter @@ -82,10 +186,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "4bef634684b2c7f3468c77c766c831229af829a0cd2d4ee6c1b99558bd14e5d2" + sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.0.9" flutter_test: dependency: "direct dev" description: flutter @@ -116,34 +220,34 @@ packages: dependency: "direct main" description: name: image_picker - sha256: "22207768556b82d55ec70166824350fee32298732d5efa4d6e756f848f51f66a" + sha256: "8b0efbf350ba4f2be1531d629396a994983d0c02f4a82a128aed84d954b90cfa" url: "https://pub.dev" source: hosted - version: "0.8.6+3" + version: "0.8.7+2" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "68d067baf7f6e401b1124ee83dd6967e67847314250fd68012aab34a69beb344" + sha256: dfb5b0f28b8786fcc662b7ed42bfb4b82a6cbbd74da1958384b10d40bdf212a7 url: "https://pub.dev" source: hosted - version: "0.8.5+7" + version: "0.8.6+6" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "66fc6e3877bbde82c33d122f3588777c3784ac5bd7d1cdd79213ef7aecb85b34" + sha256: "98f50d6b9f294c8ba35e25cc0d13b04bfddd25dbc8d32fa9d566a6572f2c081c" url: "https://pub.dev" source: hosted - version: "2.1.11" + version: "2.1.12" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "39aa70b5f1e5e7c94585b9738632d5fdb764a5655e40cd9e7b95fbd2fc50c519" + sha256: a1546ff5861fc15812953d4733b520c3d371cec3d2859a001ff04c46c4d81883 url: "https://pub.dev" source: hosted - version: "0.8.6+9" + version: "0.8.7+3" image_picker_platform_interface: dependency: transitive description: @@ -152,6 +256,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.6.3" + intl: + dependency: transitive + description: + name: intl + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" + source: hosted + version: "0.17.0" js: dependency: transitive description: @@ -279,4 +391,4 @@ packages: version: "2.1.4" sdks: dart: ">=2.18.2 <3.0.0" - flutter: ">=3.0.0" + flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index a833461..47a95fe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,6 +37,10 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 image_picker: ^0.8.6+3 + firebase_core: ^2.9.0 + firebase_auth: ^4.4.1 + firebase_storage: ^11.1.0 + cloud_firestore: ^4.5.1 dev_dependencies: flutter_test: