diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 4fe99ae..cfe5410 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -1,5 +1,4 @@ import 'dart:io'; - import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; @@ -228,7 +227,7 @@ class _AddScreenState extends State { ), ), Center( - child: Container( + child: SizedBox( height: 80, child: ListTile( leading: const Icon( @@ -245,7 +244,7 @@ class _AddScreenState extends State { ), ), Center( - child: Container( + child: SizedBox( height: 80, child: ListTile( leading: const Icon( diff --git a/lib/DetailPage.dart b/lib/DetailPage.dart index 990d938..74d97eb 100644 --- a/lib/DetailPage.dart +++ b/lib/DetailPage.dart @@ -1,6 +1,5 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; class DetailPage extends StatelessWidget { final String title; @@ -37,7 +36,7 @@ class DetailPage extends StatelessWidget { child: CircularProgressIndicator(), ), ), - errorWidget: (context, url, error) => Icon(Icons.error), + errorWidget: (context, url, error) => const Icon(Icons.error), ), ), Container( diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index 4a7a10b..26668db 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -1,6 +1,7 @@ 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/foundation.dart'; import 'package:flutter/material.dart'; import 'DetailPage.dart'; import 'package:intl/intl.dart'; @@ -52,7 +53,7 @@ class UserDefinedItem extends StatelessWidget { child: CircularProgressIndicator(), ), ), - errorWidget: (context, url, error) => Icon(Icons.error), + errorWidget: (context, url, error) => const Icon(Icons.error), ), ), Flexible( @@ -103,20 +104,16 @@ 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); +class GenericList extends StatefulWidget { + final String collectionName; + const GenericList({Key? key, required this.collectionName}) : super(key: key); @override - _NewsListState createState() => _NewsListState(); + _GenericListState createState() => _GenericListState(); } -class _NewsListState extends State { +class _GenericListState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; - late Stream newsStream; @override void initState() { @@ -127,32 +124,35 @@ class _NewsListState extends State { // Enable network firestore.settings = - Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + const Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + } - // Configure the stream to use the cache first and then the server - newsStream = firestore - .collection('News') + Stream getDocumentStream() { + return firestore + .collection(widget.collectionName) .orderBy('createdDate', descending: true) .snapshots(includeMetadataChanges: true); } - Future _deleteNews(String newsId, String? imageUrl) async { + Future _deleteDocument(String documentId, 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(); + await firestore.collection(widget.collectionName).doc(documentId).delete(); } catch (e) { - print('Error deleting news: $e'); + if (kDebugMode) { + print('Error deleting document: $e'); + } } } @override Widget build(BuildContext context) { return StreamBuilder( - stream: newsStream, + stream: getDocumentStream(), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); @@ -166,207 +166,27 @@ class _NewsListState extends State { itemCount: documents.length, itemBuilder: (BuildContext context, int index) { final Map data = - 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); - return Dismissible( - key: UniqueKey(), - direction: DismissDirection.endToStart, - onDismissed: (direction) { - _deleteNews(newsId, 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'] ?? '', - ), - ); - }, - ); - } - }, - ); - } -} - -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; - - @override - void initState() { - super.initState(); - - // Enable persistence - firestore.enablePersistence(); - - // Enable network - firestore.settings = - Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); - - // Configure the stream to use the cache first and then the server - issueStream = firestore - .collection('Issues') - .orderBy('createdDate', descending: true) - .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( - stream: issueStream, - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasError) { - return Text('Error: ${snapshot.error}'); - } - switch (snapshot.connectionState) { - case ConnectionState.waiting: - return const Text('Loading...'); - default: - final List documents = snapshot.data!.docs; - return ListView.builder( - itemCount: documents.length, - itemBuilder: (BuildContext context, int index) { - final Map data = - 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 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'] ?? '', - ), - ); - }, - ); - } - }, - ); - } -} - -class CitizensForum extends StatefulWidget { - const CitizensForum({Key? key}) : super(key: key); - - @override - _CitizensForumState createState() => _CitizensForumState(); -} - -class _CitizensForumState extends State { - final FirebaseFirestore firestore = FirebaseFirestore.instance; - late Stream>> citizenStream; - - @override - void initState() { - super.initState(); - - // Enable persistence - firestore.enablePersistence(); - - // Enable network - firestore.settings = - Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); - - // Configure the stream to use the cache first and then the server - citizenStream = firestore - .collection('CitizensForum') - .orderBy('createdDate', descending: true) - .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) { - if (snapshot.hasError) { - return Text('Error: ${snapshot.error}'); - } - switch (snapshot.connectionState) { - case ConnectionState.waiting: - return const Text('Loading...'); - default: - final List>> documents = - snapshot.data!.docs; - return ListView.builder( - itemCount: documents.length, - itemBuilder: (BuildContext context, int index) { - final Map data = documents[index].data(); + documents[index].data()! as Map; final String documentId = 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: Key(documentId), + key: UniqueKey(), direction: DismissDirection.endToStart, + onDismissed: (direction) { + _deleteDocument(documentId, data['imageUrl']); + }, background: Container( - alignment: Alignment.centerRight, - padding: const EdgeInsets.only(right: 16.0), color: Colors.red, - child: const Icon(Icons.delete, color: Colors.white), + child: const Align( + alignment: Alignment.centerRight, + child: Padding( + padding: EdgeInsets.only(right: 16), + child: Icon(Icons.delete, color: Colors.white), + ), + ), ), - onDismissed: (_) => - deleteDocument(documentId, data['imageUrl']), child: UserDefinedItem( title: data['title'] ?? '', datum: formattedDate, diff --git a/lib/home.dart b/lib/home.dart index ff3762c..aa89715 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'UserDefinedList.dart'; class MyHomePage extends StatefulWidget { - const MyHomePage({Key? key, required this.title}); + const MyHomePage({super.key, required this.title}); final String title; @@ -33,9 +33,9 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { final List widgetOptions = [ - const CitizensForum(), - const NewsList(), - const IssueList(), + const GenericList(collectionName: 'CitizensForum'), + const GenericList(collectionName: 'News'), + const GenericList(collectionName: 'Issues'), Column(mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( child: Text(login ? 'Logout' : 'Login'), @@ -68,7 +68,7 @@ class _MyHomePageState extends State { ); }, tooltip: "Add", - child: Icon(Icons.add), + child: const Icon(Icons.add), ), bottomNavigationBar: BottomNavigationBar( items: const [ diff --git a/lib/main.dart b/lib/main.dart index 2aa1d9e..5374ad6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,14 +1,8 @@ -//TEST, TEST -import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; - import 'home.dart'; import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; -// ... - - void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(