From 9d41a5f5f1bc864f72de43ca9ac5ed387bf8f72d Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Fri, 19 May 2023 17:06:12 +0200 Subject: [PATCH] changed name from ui to author_id and reduced Resolution from images on pdf list to reduce pdf size --- lib/AddPage.dart | 232 +++++++++++++++++++++------------------ lib/UserDefinedList.dart | 4 +- pubspec.lock | 40 +++---- 3 files changed, 146 insertions(+), 130 deletions(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index f5977be..1ca45dc 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -7,14 +7,13 @@ import 'package:image_picker/image_picker.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:image/image.dart' as img; - class AddScreen extends StatefulWidget { final int initialIndex; const AddScreen({Key? key, required this.initialIndex}) : super(key: key); + @override _AddScreenState createState() => _AddScreenState(); - } class _AddScreenState extends State { @@ -25,7 +24,6 @@ class _AddScreenState extends State { bool _uploading = false; int _selectedIndex = 0; - @override void initState() { super.initState(); @@ -43,14 +41,13 @@ class _AddScreenState extends State { if (originalImage != null) { int originSize = min(originalImage.width, originalImage.height); - final croppedImage = img.copyCrop( - originalImage, - x: (originalImage.width - originSize)~/2, - y: (originalImage.height - originSize)~/2, + final croppedImage = img.copyCrop(originalImage, + x: (originalImage.width - originSize) ~/ 2, + y: (originalImage.height - originSize) ~/ 2, width: originSize, - height: originSize - ); - final newPath = imageFile.path.substring(0, imageFile.path.lastIndexOf('/')); + height: originSize); + final newPath = + imageFile.path.substring(0, imageFile.path.lastIndexOf('/')); final newFile = File('$newPath/cropped.jpg'); await newFile.writeAsBytes(img.encodePng(croppedImage)); return newFile; @@ -72,17 +69,16 @@ class _AddScreenState extends State { if (originalImage != null) { if (originalImage.width == originalImage.height) { // Wenn das Bild bereits im 1:1-Format ist, überspringen Sie das Zuschneiden - if(mounted) { + if (mounted) { setState(() { _imageFile = tempFile; print("1:1"); }); } - } else { // Wenn das Bild nicht im 1:1-Format ist, schneiden Sie es zu File croppedFile = await _cropImage(tempFile); - if(mounted) { + if (mounted) { setState(() { _imageFile = croppedFile; }); @@ -94,15 +90,16 @@ class _AddScreenState extends State { } } else { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Die Dateigröße darf maximal 10 MB betragen.')), + const SnackBar( + content: Text('Die Dateigröße darf maximal 10 MB betragen.')), ); } } } - - - Future addNewElementToFirestore(String title, String description, File imageFile, {required Function(bool) onComplete}) async { + Future addNewElementToFirestore( + String title, String description, File imageFile, + {required Function(bool) onComplete}) async { String collectionName; if (_selectedIndex == 0) { collectionName = "CitizensForum"; @@ -112,8 +109,9 @@ class _AddScreenState extends State { collectionName = "Issues"; } - String imageUrl = await uploadImageToFirebaseStorage(imageFile, collectionName); - String? userId = FirebaseAuth.instance.currentUser?.uid; // get the user ID + String imageUrl = + await uploadImageToFirebaseStorage(imageFile, collectionName); + String? userId = FirebaseAuth.instance.currentUser?.uid; // get the user ID try { await FirebaseFirestore.instance.collection(collectionName).add({ @@ -121,27 +119,29 @@ class _AddScreenState extends State { "description": description, "imageUrl": imageUrl, "createdDate": DateTime.now(), - "userId": userId, // add the user ID to the document + "author_uid": userId, // add the user ID to the document }); onComplete(true); - } catch(e) { + } catch (e) { onComplete(false); } } - - Future uploadImageToFirebaseStorage(File imageFile, String collectionName) async { - Reference ref = FirebaseStorage.instance.ref().child("$collectionName/${DateTime.now().toString()}"); + Future uploadImageToFirebaseStorage( + File imageFile, String collectionName) async { + Reference ref = FirebaseStorage.instance + .ref() + .child("$collectionName/${DateTime.now().toString()}"); UploadTask uploadTask = ref.putFile(imageFile); return await (await uploadTask).ref.getDownloadURL(); } - - @override Widget build(BuildContext context) { String appBarTitle = ''; + double keyboardHeight = MediaQuery.of(context).viewInsets.bottom; + if (_selectedIndex == 0) { appBarTitle = 'Neue BürgerForum Information'; } else if (_selectedIndex == 1) { @@ -171,19 +171,27 @@ class _AddScreenState extends State { child: IconButton( icon: const Icon(Icons.check), onPressed: () async { - if (_formKey.currentState!.validate() && _imageFile != null && !_uploading) { + if (_formKey.currentState!.validate() && + _imageFile != null && + !_uploading) { setState(() { _uploading = true; }); - Navigator.pop(context); // Fenster direkt schließen, nachdem der Upload-Button gedrückt wurde. - await addNewElementToFirestore(_titleController.text, _descriptionController.text, _imageFile!, onComplete: (bool success) { - if(mounted) { + Navigator.pop( + context); // Fenster direkt schließen, nachdem der Upload-Button gedrückt wurde. + await addNewElementToFirestore( + _titleController.text, + _descriptionController.text, + _imageFile!, onComplete: (bool success) { + if (mounted) { setState(() { _uploading = false; }); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(success ? 'Upload erfolgreich.' : 'Upload fehlgeschlagen.'), + content: Text(success + ? 'Upload erfolgreich.' + : 'Upload fehlgeschlagen.'), ), ); } @@ -237,96 +245,104 @@ class _AddScreenState extends State { ), const SizedBox(height: 16.0), _imageFile != null - ? Image.file(_imageFile!) - : Container( - height: 200.0, - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(16.0), + ? Expanded( + child: LayoutBuilder( + builder: (context, constraints) { + double imageHeight = max(0, constraints.maxHeight - keyboardHeight); + return Container( + height: imageHeight, + child: Image.file(_imageFile!), + ); + }, ), - child: Center( - child: TextButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (context) => - Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - height: 60, - padding: const EdgeInsets.symmetric( - horizontal: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment - .spaceBetween, - children: [ - const Text( - 'Bild hinzufügen', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, + ) + + : Container( + height: 200.0, + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(16.0), + ), + child: Center( + child: TextButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (context) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 60, + padding: const EdgeInsets.symmetric( + horizontal: 16), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Bild hinzufügen', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), - ), - IconButton( - icon: const Icon(Icons.close), - onPressed: () { + IconButton( + icon: const Icon(Icons.close), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ), + ), + Center( + child: SizedBox( + height: 80, + child: ListTile( + leading: const Icon(Icons.photo_library, + size: 40), + title: const Text( + 'Galerie auswählen', + style: TextStyle(fontSize: 20), + ), + onTap: () { Navigator.pop(context); + _getImage(ImageSource.gallery); }, ), - ], - ), - ), - Center( - child: SizedBox( - height: 80, - child: ListTile( - leading: const Icon( - Icons.photo_library, size: 40), - title: const Text( - 'Galerie auswählen', - style: TextStyle(fontSize: 20), - ), - onTap: () { - Navigator.pop(context); - _getImage(ImageSource.gallery); - }, ), ), - ), - Center( - child: SizedBox( - height: 80, - child: ListTile( - leading: const Icon( - Icons.camera_alt, size: 40), - title: const Text( - 'Kamera verwenden', - style: TextStyle(fontSize: 20), + Center( + child: SizedBox( + height: 80, + child: ListTile( + leading: const Icon(Icons.camera_alt, + size: 40), + title: const Text( + 'Kamera verwenden', + style: TextStyle(fontSize: 20), + ), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.camera); + }, ), - onTap: () { - Navigator.pop(context); - _getImage(ImageSource.camera); - }, ), ), - ), - ], + ], + ), + ); + }, + child: Text( + 'Bild hinzufügen', + style: TextStyle( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold, ), - ); - }, - child: Text( - 'Bild hinzufügen', - style: TextStyle( - color: Theme - .of(context) - .primaryColor, - fontWeight: FontWeight.bold, + ), + ), ), ), - ), - ), - ), ], ), ), diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index b314b1a..5ebb932 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -214,7 +214,7 @@ class _GenericListState extends State { DateFormat('dd.MM.yyyy').format(createdDate); final currentUser = FirebaseAuth.instance.currentUser; - if (currentUser != null && data['userId'] == currentUser.uid) { + if (currentUser != null && data['author_uid'] == currentUser.uid) { return Dismissible( key: UniqueKey(), direction: DismissDirection.endToStart, @@ -368,7 +368,7 @@ class _GenericListState extends State { final Uint8List bytes = response.bodyBytes; final img.Image? image = img.decodeImage(bytes); - final img.Image resizedImage = img.copyResize(image!, width: 500); // Beispielwert für die Breite + final img.Image resizedImage = img.copyResize(image!, width: 290); // Beispielwert für die Breite final Uint8List resizedBytes = Uint8List.fromList(img.encodeJpg(resizedImage)); final imageProvider = pdfWidgets.MemoryImage(resizedBytes); diff --git a/pubspec.lock b/pubspec.lock index 637e761..c87b753 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.10.0" barcode: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.1" clock: dependency: transitive description: @@ -125,10 +125,10 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 url: "https://pub.dev" source: hosted - version: "1.17.1" + version: "1.17.0" convert: dependency: transitive description: @@ -404,10 +404,10 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.6.5" lints: dependency: transitive description: @@ -428,10 +428,10 @@ packages: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "0.12.13" material_color_utilities: dependency: transitive description: @@ -444,10 +444,10 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.8.0" nested: dependency: transitive description: @@ -468,10 +468,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.8.2" path_parsing: dependency: transitive description: @@ -540,10 +540,10 @@ packages: dependency: transitive description: name: pdf_widget_wrapper - sha256: e9d31fd7782ce28ae346b127ea7d1cd748d799bddee379f31191693610e23749 + sha256: "754867bf32c4683da29ccc6bf31250905431fb0818a7258c153e21cd627b3212" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.0" pedantic: dependency: transitive description: @@ -697,10 +697,10 @@ packages: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.4.16" typed_data: dependency: transitive description: @@ -750,5 +750,5 @@ packages: source: hosted version: "6.2.2" sdks: - dart: ">=3.0.0-0 <4.0.0" - flutter: ">=3.9.0" + dart: ">=2.19.0 <3.0.0" + flutter: ">=3.7.0"