From aeef64a10909a0dcca9b481a4dbd7ceabc051307 Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Thu, 13 Apr 2023 16:51:29 +0200 Subject: [PATCH 01/11] 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: From 6f22b245965173e7fcfe63a55ad745ee999b800b Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Thu, 13 Apr 2023 21:35:50 +0200 Subject: [PATCH 02/11] Doppelter upload fix --- lib/AddPage.dart | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 7049861..7172113 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -16,6 +16,7 @@ class _AddScreenState extends State { final _titleController = TextEditingController(); final _descriptionController = TextEditingController(); File? _imageFile; + bool _uploading = false; Future _getImage(ImageSource source) async { final pickedFile = await ImagePicker().getImage(source: source); @@ -68,16 +69,24 @@ class _AddScreenState extends State { child: IconButton( icon: Icon(Icons.check), onPressed: () async { - if (_formKey.currentState!.validate() && _imageFile != null) { + if (_formKey.currentState!.validate() && _imageFile != null && !_uploading) { + setState(() { + _uploading = true; + }); try { await addNewElementToFirestore(_titleController.text, _descriptionController.text, _imageFile!); Navigator.pop(context); } catch (e) { print(e); // Fehlerbehandlung hier + } finally { + setState(() { + _uploading = false; + }); } } }, + ), ), ], From 63b46e59a1b36619fc3ab04d4445476484aa1bd2 Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Thu, 13 Apr 2023 22:14:49 +0200 Subject: [PATCH 03/11] =?UTF-8?q?Beginn=20News=20oder=20Issue=20eintr?= =?UTF-8?q?=C3=A4ge=20auf=20firebase.=20(Untested)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/AddPage.dart | 36 ++++++++++++++++++++++++++++++------ lib/home.dart | 2 +- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 7172113..7e36411 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -7,8 +7,12 @@ import 'package:cloud_firestore/cloud_firestore.dart'; class AddScreen extends StatefulWidget { + final int initialIndex; + + AddScreen({required this.initialIndex}); @override _AddScreenState createState() => _AddScreenState(); + } class _AddScreenState extends State { @@ -17,6 +21,13 @@ class _AddScreenState extends State { final _descriptionController = TextEditingController(); File? _imageFile; bool _uploading = false; + int _selectedIndex = 0; + + @override + void initState() { + super.initState(); + _selectedIndex = widget.initialIndex; + } Future _getImage(ImageSource source) async { final pickedFile = await ImagePicker().getImage(source: source); @@ -36,12 +47,25 @@ class _AddScreenState extends State { 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(), - }); + if(_selectedIndex == 1) + { + await FirebaseFirestore.instance.collection("Issues").add({ + "title": title, + "description": description, + "imageUrl": imageUrl, + "createdDate": DateTime.now(), + }); + } + else + { + await FirebaseFirestore.instance.collection("News").add({ + "title": title, + "description": description, + "imageUrl": imageUrl, + "createdDate": DateTime.now(), + }); + } + } diff --git a/lib/home.dart b/lib/home.dart index 1e7b5b5..151def7 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -70,7 +70,7 @@ class _MyHomePageState extends State { onPressed: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => AddScreen()), + MaterialPageRoute(builder: (context) => AddScreen(initialIndex: _selectedIndex,)), ); }, tooltip: "Add", From 68c301cd83381c95bfef81ef9caa7f4524a98487 Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Fri, 14 Apr 2023 20:00:01 +0200 Subject: [PATCH 04/11] News & Issue upload on firebase works with seperate picture folders --- lib/AddPage.dart | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 7e36411..d748a0e 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -42,13 +42,15 @@ 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 if(_selectedIndex == 1) { + Reference ref = FirebaseStorage.instance.ref().child("Issues/${DateTime.now().toString()}"); + UploadTask uploadTask = ref.putFile(imageFile); + String imageUrl = await (await uploadTask).ref.getDownloadURL(); + await FirebaseFirestore.instance.collection("Issues").add({ "title": title, "description": description, @@ -58,6 +60,9 @@ class _AddScreenState extends State { } else { + Reference ref = FirebaseStorage.instance.ref().child("News/${DateTime.now().toString()}"); + UploadTask uploadTask = ref.putFile(imageFile); + String imageUrl = await (await uploadTask).ref.getDownloadURL(); await FirebaseFirestore.instance.collection("News").add({ "title": title, "description": description, From 7f98cf931eeb08fa4a0f861136eca39c06f28e5c Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Thu, 20 Apr 2023 16:21:40 +0200 Subject: [PATCH 05/11] =?UTF-8?q?Datum=20beim=20layout=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/UserDefinedList.dart | 62 +++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index beca511..e18701e 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -1,36 +1,39 @@ import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'DetailPage.dart'; - - +import 'package:intl/intl.dart'; class UserDefinedItem extends StatelessWidget { final String title; + final String datum; final String description; final Image? image; - - const UserDefinedItem({super.key, + const UserDefinedItem({ + Key? key, required this.title, required this.description, + required this.datum, this.image, - }); + }) : super(key: key); + @override Widget build(BuildContext context) { - String shortDescription = "${description.substring(0, 30)}..."; + String shortDescription = "${description.substring(0,34)}..."; + return Padding( padding: const EdgeInsets.symmetric(vertical: 1.0), child: Card( child: InkWell( onTap: () { - // Open a new screen when the user taps on the list item + // Open a new screen when the user taps on the list item Navigator.push( - context, + context, MaterialPageRoute( builder: (context) => DetailPage( title: title, description: description, - image: image!= null ? image! : null, + image: image != null ? image! : null, ), ), ); @@ -42,17 +45,31 @@ class UserDefinedItem extends StatelessWidget { height: 130, child: image, ), - Expanded( + Flexible( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.all(8.0), - child: Text( - title, - style: const TextStyle( - fontSize: 24, // beliebige Schriftgröße - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + title, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 20, // beliebige Schriftgröße + ), + ), + ), + Text( + datum, + style: const TextStyle( + fontSize: 16, // beliebige Schriftgröße + ), + ), + ], ), ), Padding( @@ -69,7 +86,7 @@ class UserDefinedItem extends StatelessWidget { ), ], ), - ) + ), ), ); } @@ -78,6 +95,8 @@ class UserDefinedItem extends StatelessWidget { + + class NewsList extends StatelessWidget { const NewsList({super.key}); @@ -88,41 +107,49 @@ class NewsList extends StatelessWidget { children: [ UserDefinedItem( title: 'Rosalia Kapelle', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Kapelle bei der Ausfahrt von Oggau', image: Image.network('https://upload.wikimedia.org/wikipedia/commons/d/d7/Oggau_Rosaliakapelle.JPG'), ), UserDefinedItem( title: 'Kirche der Marktgemeinde Oggau', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Die römisch-katholische Pfarrkirche Oggau steht abseits der Hauptstraße in einem ehemaligen ummauerten Friedhof in der Marktgemeinde Oggau am Neusiedler See im Bezirk Eisenstadt-Umgebung im Burgenland. Die der Heiligen Dreifaltigkeit und Simon Zelotes und Judas Thaddäus geweihte Pfarrkirche gehört zum Dekanat Eisenstadt-Rust in der Diözese Eisenstadt. Die Kirche steht unter Denkmalschutz.', image: Image.network('https://upload.wikimedia.org/wikipedia/commons/e/e6/Oggau_Kirche2.JPG'), ), UserDefinedItem( title: 'Gasthaus Monika', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Herzlich willkommen im Gasthaus Monika\nDas traditionelle Gasthaus Monika in Oggau am Neusiedler See steht bereits seit vielen Jahren für Gastfreundschaft. Vor über 80 Jahren wurde das Wirtshaus erbaut und stetig modernisiert. Mit der Übernahme im Jahr 1975 hat sich Familie Gmasz es sich zur Aufgabe gemacht, ihr Wirtshaus authentisch und traditionell weiterzuführen.\nDas freundliche und kompetente Team rund um Monika Gmasz, verwöhnt seine Gäste mit guter, bodenständiger Küche in gemütlicher Atmosphäre.\nIm Juni, Juli und August haben wir für Sie auch jeden Montag geöffnet.', image: Image.network('https://thumbor.apps.unitecms.io/unsafe/1400x0/https://ama-media.ams3.digitaloceanspaces.com/5f4e06d582ddc/a_pov81202.jpg'), ), UserDefinedItem( title: 'Sebastiankeller', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Kulinarik - Spezialitäten von Sonja und Bernhard Landauer\nGemeinsam mit meinem Sohn Bernhard und unserem Küchenteam sorgen wir für besondere und vor allem regionalen und traditionellen, kulinarischen Genüsse. Mein Mann, Ossi Landauer und das Serviceteam ist um Ihr Wohl bemüht und lässt keine Wünsche offen.\nAuf der Speisekarte des Sebastiankellers sind neben Fisch, -Grill, -Sautanzspezialitäten viele saisonale Schmankerl und auch nicht alltägliche Gerichte wie „Gebackenen Fledermäuse“ (da ist das beste Teil vom Schweinsschlögl) oder „Geschmorte Rindswangerl“, zu finden.\nÜberwiegend werden regionale Produkte, zum Teil aus eigenem Anbau verarbeitet. So kommen die Brombeeren, Zwetschen, Quitten, Hollunder oder Kürbisse aus unserem eigenen Garten. Was an Früchten zu viel ist wird, kochen wir ein, wird zu Saft verarbeitet oder destilliert.', image: Image.network('https://10619-2.s.cdn12.com/rests/original/315_49137159.jpg'), ), UserDefinedItem( title: 'Rosalia Kapelle', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Kapelle bei der Ausfahrt von Oggau', image: Image.network('https://upload.wikimedia.org/wikipedia/commons/d/d7/Oggau_Rosaliakapelle.JPG'), ), UserDefinedItem( title: 'Rosalia Kapelle', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Kapelle bei der Ausfahrt von Oggau', image: Image.network('https://upload.wikimedia.org/wikipedia/commons/d/d7/Oggau_Rosaliakapelle.JPG'), ), UserDefinedItem( title: 'Rosalia Kapelle', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Kapelle bei der Ausfahrt von Oggau', image: Image.network('https://upload.wikimedia.org/wikipedia/commons/d/d7/Oggau_Rosaliakapelle.JPG'), ), UserDefinedItem( title: 'Gemeinde Amt Oggau', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Gemeide Amt der Marktgemeinde Oggau. SPÖ regierend', image: Image.network('https://upload.wikimedia.org/wikipedia/commons/a/a1/Oggau_am_Neusiedler_See_-_Gemeindeamt_%2801%29.jpg'), ), @@ -151,11 +178,13 @@ class IssueList extends StatelessWidget { Widget build(BuildContext context) { final UserDefinedItem item1 = UserDefinedItem( title: 'Licht ausgebrannt', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Licht ist ausgebrannt in der Sebastianstraße', image: Image.network('https://api.ebsg.at/uploads/immo70/originals/objekt_809_oggau-am-neusiedler-see_7063_6021.jpeg',), ); final UserDefinedItem item2 = UserDefinedItem( title: 'test2', + datum: DateFormat('dd.MM.yyyy').format(DateTime.now()), description: 'Gemeide Amt der Marktgemeinde Oggau. SPÖ regierend', image: Image.network('https://upload.wikimedia.org/wikipedia/commons/a/a1/Oggau_am_Neusiedler_See_-_Gemeindeamt_%2801%29.jpg'), ); @@ -164,6 +193,7 @@ class IssueList extends StatelessWidget { return ListView( children: _items.map((item) => UserDefinedItem( title: item.title, + datum: item.datum, description: item.description, image: item.image, ), From b3399fd504a6b21f330546abf684fd7f6836a756 Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Wed, 26 Apr 2023 17:43:51 +0200 Subject: [PATCH 06/11] rename gemeindetrommler --- .../app/src/main/kotlin/com/example/demoapp/MainActivity.kt | 6 ------ android/app/src/profile/AndroidManifest.xml | 2 +- lib/home.dart | 2 +- pubspec.lock | 2 +- pubspec.yaml | 4 ++-- test/widget_test.dart | 2 +- 6 files changed, 6 insertions(+), 12 deletions(-) delete mode 100644 android/app/src/main/kotlin/com/example/demoapp/MainActivity.kt diff --git a/android/app/src/main/kotlin/com/example/demoapp/MainActivity.kt b/android/app/src/main/kotlin/com/example/demoapp/MainActivity.kt deleted file mode 100644 index 6d280c3..0000000 --- a/android/app/src/main/kotlin/com/example/demoapp/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.demoapp - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 7eaacd8..e2d25f1 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.example.oggauer_gemeindetrommler">