import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:image/image.dart' as image_lib; import 'package:stadtbote/model/task_info.dart'; import 'package:stadtbote/tools/util.dart'; Future showTakePhotosPopup(BuildContext context, TaskInfo taskInfo, Function(List) onFinished) async { List imageDataList = []; List imageWidgetsList = []; int currentCarousselSliderIndex = 0; ValueNotifier> imageWidgetsListNotifier = ValueNotifier>([]); await showDialog( context: context, builder: (BuildContext context) { return WillPopScope( onWillPop: () async { return await taskDialogSecurityException(context); }, child: AlertDialog( contentPadding: EdgeInsets.zero, shadowColor: Colors.transparent, backgroundColor: Colors.white, content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) { void capturePhoto() async { try { var photo = await Util.capturePhoto(); if (photo != null) { var fullsizeImageData = await photo.readAsBytes(); image_lib.Image? image = image_lib.decodeImage(fullsizeImageData); if (image != null) { var thumbnail = image_lib.copyResize(image, width: 800); var resizedImageData = image_lib.encodeJpg(thumbnail, quality: 75); photo.delete(); imageDataList.add(resizedImageData); imageWidgetsList.add(GestureDetector( onTap: () {}, child: GestureDetector( onTap: () async { await showQuestionDialog(context, "Achtung", "Wollen Sie das Bild wirklich löschen?", [ TextButton(onPressed: () => {Navigator.of(context).pop(), imageDataList.removeAt(currentCarousselSliderIndex), imageWidgetsList.removeAt(currentCarousselSliderIndex), Util.logInfo("image deleted $currentCarousselSliderIndex"), currentCarousselSliderIndex = 0, setState(() {}) }, child: const Text('Ja')), TextButton(onPressed: () => {Navigator.of(context).pop()}, child: const Text('Nein')), ]); }, child: Image.memory(resizedImageData), ) )); imageWidgetsListNotifier.value = imageWidgetsList; setState(() {}); } } } catch (ex) { Util.logException(ex.toString()); } } return SizedBox( key: GlobalKey(), height: 545, width: MediaQuery.of(context).size.width * 0.8, child: Container( height: 100, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, border: Border.all( color: Colors.grey, width: 0.5, ), ), child: Padding( padding: const EdgeInsets.all(35.0), child: Column( children: [ const Text('Aufgenommene Fotos'), const SizedBox(height: 20), Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, border: Border.all( color: Colors.grey, width: 0.5, ), ), height: 300, child: ValueListenableBuilder>( valueListenable: imageWidgetsListNotifier, builder: (context, value, child) { return CarouselSlider( options: CarouselOptions( disableCenter: false, enableInfiniteScroll: false, onPageChanged: (index, reason) { currentCarousselSliderIndex = index; }, ), items: imageWidgetsList.toList()); }, ), ), const SizedBox(height: 20), Visibility( visible: imageDataList.length < taskInfo.task.max!, child: getDefaultButton('Hinzufügen', buttonHeight: 50, () => {capturePhoto()})), const SizedBox(height: 12), getDefaultButton( 'Übernehmen', buttonHeight: 50, () => { if (imageDataList.length >= taskInfo.task.min! && imageDataList.length <= taskInfo.task.max!) {Navigator.of(context).pop(), onFinished(imageDataList)} else {showAlertDialog('Fehler', 'Es müssen mindestens ${taskInfo.task.min} Foto(s) aufgenommen werden')} }) ], ), ), )); }))); }); }