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: