From b59147e27fddd8555826046992a39dff9f289533 Mon Sep 17 00:00:00 2001 From: Schummi C Date: Thu, 4 May 2023 16:42:47 +0200 Subject: [PATCH] =?UTF-8?q?Vorhandene=20News=20&=20B=C3=BCrgerforumnews=20?= =?UTF-8?q?&=20M=C3=A4ngel=20k=C3=B6nnen=20mit=20einem=20swipe=20nach=20re?= =?UTF-8?q?chts=20gel=C3=B6scht=20werden,=20es=20werden=20nun=20auch=20die?= =?UTF-8?q?=20Bilder=20aus=20den=20jeweilligen=20Firebase=20Ordnern=20gel?= =?UTF-8?q?=C3=B6scht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/UserDefinedList.dart | 138 +++++++++++++++++++++++++++------------ 1 file changed, 98 insertions(+), 40 deletions(-) diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index c8dd809..4a7a10b 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/material.dart'; import 'DetailPage.dart'; import 'package:intl/intl.dart'; @@ -27,13 +28,12 @@ class UserDefinedItem extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => - DetailPage( - title: title, - datum: datum, - description: description, - imageUrl: imageUrl, - ), + builder: (context) => DetailPage( + title: title, + datum: datum, + description: description, + imageUrl: imageUrl, + ), ), ); }, @@ -54,8 +54,6 @@ class UserDefinedItem extends StatelessWidget { ), errorWidget: (context, url, error) => Icon(Icons.error), ), - - ), Flexible( flex: 1, @@ -72,8 +70,7 @@ class UserDefinedItem extends StatelessWidget { title, overflow: TextOverflow.ellipsis, style: const TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold), + fontSize: 20, fontWeight: FontWeight.bold), ), ), Text( @@ -110,14 +107,13 @@ class UserDefinedItem extends StatelessWidget { // Ändern Sie die Verwendung von Image.network in UserDefinedItem-Widgets in Ihren ListView.builder-Aufrufen: - - class NewsList extends StatefulWidget { const NewsList({Key? key}) : super(key: key); @override _NewsListState createState() => _NewsListState(); } + class _NewsListState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; late Stream newsStream; @@ -130,7 +126,8 @@ class _NewsListState extends State { firestore.enablePersistence(); // Enable network - firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + firestore.settings = + Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); // Configure the stream to use the cache first and then the server newsStream = firestore @@ -139,8 +136,13 @@ class _NewsListState extends State { .snapshots(includeMetadataChanges: true); } - Future _deleteNews(String newsId) async { + Future _deleteNews(String newsId, String? imageUrl) async { try { + if (imageUrl != null) { + // Löschen Sie das Bild vom Firebase Storage + await FirebaseStorage.instance.refFromURL(imageUrl).delete(); + } + // Löschen Sie das Dokument von der Firestore-Kollektion await firestore.collection('News').doc(newsId).delete(); } catch (e) { print('Error deleting news: $e'); @@ -164,20 +166,20 @@ class _NewsListState extends State { itemCount: documents.length, itemBuilder: (BuildContext context, int index) { final Map data = - documents[index].data()! as Map; + documents[index].data()! as Map; final String newsId = documents[index].id; final DateTime createdDate = data['createdDate'].toDate(); final formattedDate = - DateFormat('dd.MM.yyyy').format(createdDate); + DateFormat('dd.MM.yyyy').format(createdDate); return Dismissible( key: UniqueKey(), direction: DismissDirection.endToStart, onDismissed: (direction) { - _deleteNews(newsId); + _deleteNews(newsId, data['imageUrl']); }, background: Container( color: Colors.red, - child: Align( + child: const Align( alignment: Alignment.centerRight, child: Padding( padding: EdgeInsets.only(right: 16), @@ -200,13 +202,13 @@ class _NewsListState extends State { } } - class IssueList extends StatefulWidget { const IssueList({Key? key}) : super(key: key); @override _IssueListState createState() => _IssueListState(); } + class _IssueListState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; late Stream issueStream; @@ -219,7 +221,8 @@ class _IssueListState extends State { firestore.enablePersistence(); // Enable network - firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + firestore.settings = + Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); // Configure the stream to use the cache first and then the server issueStream = firestore @@ -228,6 +231,16 @@ class _IssueListState extends State { .snapshots(includeMetadataChanges: true); } + Future _deleteIssue(String issueId, String imageUrl) async { + try { + final Reference ref = FirebaseStorage.instance.refFromURL(imageUrl); + await ref.delete(); + await firestore.collection('Issues').doc(issueId).delete(); + } catch (e) { + print('Error deleting issue: $e'); + } + } + @override Widget build(BuildContext context) { return StreamBuilder( @@ -245,16 +258,33 @@ class _IssueListState extends State { itemCount: documents.length, itemBuilder: (BuildContext context, int index) { final Map data = - documents[index].data()! as Map; - final DateTime createdDate = - data['createdDate'].toDate(); + documents[index].data()! as Map; + final String issueId = documents[index].id; + final DateTime createdDate = data['createdDate'].toDate(); final formattedDate = - DateFormat('dd.MM.yyyy').format(createdDate); - return UserDefinedItem( - title: data['title'] ?? '', - datum: formattedDate, - description: data['description'] ?? '', - imageUrl: data['imageUrl'] ?? '', + DateFormat('dd.MM.yyyy').format(createdDate); + return Dismissible( + key: UniqueKey(), + direction: DismissDirection.endToStart, + onDismissed: (direction) { + _deleteIssue(issueId, data['imageUrl']); + }, + background: Container( + color: Colors.red, + child: const Align( + alignment: Alignment.centerRight, + child: Padding( + padding: EdgeInsets.only(right: 16), + child: Icon(Icons.delete, color: Colors.white), + ), + ), + ), + child: UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + imageUrl: data['imageUrl'] ?? '', + ), ); }, ); @@ -263,6 +293,7 @@ class _IssueListState extends State { ); } } + class CitizensForum extends StatefulWidget { const CitizensForum({Key? key}) : super(key: key); @@ -282,7 +313,8 @@ class _CitizensForumState extends State { firestore.enablePersistence(); // Enable network - firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + firestore.settings = + Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); // Configure the stream to use the cache first and then the server citizenStream = firestore @@ -291,11 +323,22 @@ class _CitizensForumState extends State { .snapshots(includeMetadataChanges: true); } + Future deleteDocument(String documentId, String? imageUrl) async { + // Delete document + await firestore.collection('CitizensForum').doc(documentId).delete(); + + // Delete image file + if (imageUrl != null) { + await FirebaseStorage.instance.refFromURL(imageUrl).delete(); + } + } + @override Widget build(BuildContext context) { return StreamBuilder>>( stream: citizenStream, - builder: (BuildContext context, AsyncSnapshot>> snapshot) { + builder: (BuildContext context, + AsyncSnapshot>> snapshot) { if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); } @@ -303,18 +346,33 @@ class _CitizensForumState extends State { case ConnectionState.waiting: return const Text('Loading...'); default: - final List>> documents = snapshot.data!.docs; + final List>> documents = + snapshot.data!.docs; return ListView.builder( itemCount: documents.length, itemBuilder: (BuildContext context, int index) { final Map data = documents[index].data(); + final String documentId = documents[index].id; final DateTime createdDate = data['createdDate'].toDate(); - final formattedDate = DateFormat('dd.MM.yyyy').format(createdDate); - return UserDefinedItem( - title: data['title'] ?? '', - datum: formattedDate, - description: data['description'] ?? '', - imageUrl: data['imageUrl'] ?? '', + final formattedDate = + DateFormat('dd.MM.yyyy').format(createdDate); + return Dismissible( + key: Key(documentId), + direction: DismissDirection.endToStart, + background: Container( + alignment: Alignment.centerRight, + padding: const EdgeInsets.only(right: 16.0), + color: Colors.red, + child: const Icon(Icons.delete, color: Colors.white), + ), + onDismissed: (_) => + deleteDocument(documentId, data['imageUrl']), + child: UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + imageUrl: data['imageUrl'] ?? '', + ), ); }, ); @@ -322,4 +380,4 @@ class _CitizensForumState extends State { }, ); } -} \ No newline at end of file +}