Erweiterungen

This commit is contained in:
Sven committed 2024-02-12 17:03:03 +01:00
1 parent c604dc9d55
commit 31fe4c5a06
20 files changed
+1804 -654

No files matched your search

+39 -58
View File
@@ -1,11 +1,10 @@
import 'package:flutter/material.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:stadtbote/main.dart';
import 'package:stadtbote/model/session_status.dart';
import 'package:stadtbote/tools/mqtt_core.dart';
import 'package:stadtbote/tools/util.dart';
void showInfosPopup(BuildContext context, SessionStatus? status) {
void showInfosPopup(BuildContext context, SessionStatus? status) async {
var text = "Versionsnummer: a203\n";
text += "Verbindungsstatus: ${MqttCore.instance.connectionState == ConnectionStateEnum.connected ? "Verbunden" : "NICHT verbunden"}\n";
text += "GPS-Status: ${MyApp.currentPosition != null ? MyApp.currentPosition!.timestamp.toString() : "Unbekannt"}\n";
@@ -22,59 +21,41 @@ void showInfosPopup(BuildContext context, SessionStatus? status) {
text += "Keine Informationen gefunden";
}
showPopupWindow(
context,
//childSize:Size(240, MediaQuery.of(context).size.width * 0.8),
gravity: KumiPopupGravity.center,
//curve: Curves.elasticOut,
bgColor: Colors.grey.withOpacity(0.5),
clickOutDismiss: true,
clickBackDismiss: true,
customAnimation: false,
customPop: false,
customPage: false,
// targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox),
//needSafeDisplay: true,
underStatusBar: false,
underAppBar: false,
//offsetX: -180,
//offsetY: 50,
duration: const Duration(milliseconds: 200),
onShowStart: (pop) {},
onShowFinish: (pop) {},
onDismissStart: (pop) {},
onDismissFinish: (pop) {},
onClickOut: (pop) {},
onClickBack: (pop) {},
childFun: (pop) {
return SizedBox(
key: GlobalKey(),
height: 350,
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: 1,
),
),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
children: [
Expanded(child: Text(text, textAlign: TextAlign.left)),
getDefaultButton(
'OK',
() => {Navigator.pop(context)},
),
],
),
),
)
);
},
);
}
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
shadowColor: Colors.transparent,
backgroundColor: Colors.white,
content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
return SizedBox(
key: GlobalKey(),
height: 350,
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: 1,
),
),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
children: [
Expanded(child: Text(text, textAlign: TextAlign.left)),
getDefaultButton(
'OK',
() => {Navigator.pop(context)},
),
],
),
),
));
}));
});
}
+164 -191
View File
@@ -3,209 +3,182 @@ import 'dart:async';
import 'package:animated_toggle_switch/animated_toggle_switch.dart';
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:latlong2/latlong.dart';
import '../model/job_tour.dart';
void showMapPopup(BuildContext context, JobTour currentTour, List<JobTour> tourList) {
showPopupWindow(
context,
//childSize:Size(240, 800),
gravity: KumiPopupGravity.center,
//curve: Curves.elasticOut,
bgColor: Colors.grey.withOpacity(0.5),
clickOutDismiss: true,
clickBackDismiss: true,
customAnimation: false,
customPop: false,
customPage: false,
// targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox),
//needSafeDisplay: true,
underStatusBar: false,
underAppBar: false,
//offsetX: -180,
//offsetY: 50,
duration: const Duration(milliseconds: 300),
onShowStart: (pop) {},
onShowFinish: (pop) {},
onDismissStart: (pop) {},
onDismissFinish: (pop) {},
onClickOut: (pop) {},
onClickBack: (pop) {},
childFun: (pop) {
var mapController = MapController();
Map<int, StreamController<bool>> streamController = {};
showMapPopup(BuildContext context, JobTour currentTour, List<JobTour> tourList) async {
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
shadowColor: Colors.transparent,
backgroundColor: Colors.white,
content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
var mapController = MapController();
Map<int, StreamController<bool>> streamController = {};
List<Widget> tourWidgets = [];
for(JobTour tour in tourList) {
var currentStreamController = StreamController<bool>();
streamController[tour.sort] = currentStreamController;
List<Widget> tourWidgets = [];
for (JobTour tour in tourList) {
var currentStreamController = StreamController<bool>();
streamController[tour.sort] = currentStreamController;
tourWidgets.add(
GestureDetector(
onTap: () async {
mapController.move(LatLng(tour.pos!.lat, tour.pos!.long), mapController.zoom);
tourWidgets.add(
GestureDetector(
onTap: () async {
mapController.move(LatLng(tour.pos!.lat, tour.pos!.long), mapController.zoom);
streamController[currentTour.sort]!.sink.add(false);
streamController[currentTour.sort]!.sink.add(false);
currentTour = tour;
streamController[tour.sort]!.sink.add(true);
},
child: SizedBox(
width: 70,
height: 80,
child: Column(
children: [
Container(
height: 50,
width: 70,
color: Colors.transparent,
child: const Icon(
Icons.person_pin_circle,
color: Colors.blue,
size: 56,
),
),
const SizedBox(height: 2),
SizedBox(
height: 12.0,
width: 70,
child: Text(
"Station ${tour.sort}",
softWrap: true,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.black,
fontSize: 10.0,
),
),
),
StreamBuilder<bool>(
stream: currentStreamController.stream,
builder: (context, snapshot) {
bool tourSelected = tour.sort == currentTour.sort;
if (snapshot.hasData) {
tourSelected = snapshot.data as bool;
}
return Container(
height: 2,
color: tourSelected ? Colors.green : Colors.transparent,
);
}
),
],
),
),
),
);
}
final ValueNotifier<bool> valueNotifier = ValueNotifier<bool>(true);
List<Marker> markers = [];
for (var tour in tourList) {
markers.add(
Marker(
builder: (context) => const Icon(Icons.person_pin_circle, size: 56, color: Colors.blue),
point: LatLng(tour.pos!.lat, tour.pos!.long)
)
);
}
return Container(
padding: const EdgeInsets.fromLTRB(30, 0, 30, 0),
key: GlobalKey(),
height: MediaQuery.of(context).size.height * 0.6,
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(8.0),
child: Column(
children: [
SizedBox(
height: 80,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: tourWidgets,
),
)
),
Row(
children: [
Expanded(
child: ValueListenableBuilder<bool>(
valueListenable: valueNotifier,
builder: (context, value, child) {
return AnimatedToggleSwitch<bool>.dual(
current: value,
first: true,
second: false,
dif: 0.0,
borderColor: Colors.transparent,
borderWidth: 5.0,
height: 25,
boxShadow: const [
BoxShadow(
color: Colors.black26,
spreadRadius: 1,
blurRadius: 2,
offset: Offset(0, 1.5),
),
],
onChanged: (b) {
valueNotifier.value = b;
mapController.move(mapController.center, b ? 14.0 : 16.0);
},
colorBuilder: (b) => b ? Colors.red : Colors.green,
textBuilder: (value) => value
? const Center(child: Text('Fern'))
: const Center(child: Text('Nah')),
);
},
),
),
],
),
const SizedBox(height: 10),
Expanded(
child:
AbsorbPointer(
absorbing: true,
child: FlutterMap(
mapController: mapController,
options: MapOptions(
center: LatLng(currentTour.pos!.lat, currentTour.pos!.long),
zoom: 14,
),
currentTour = tour;
streamController[tour.sort]!.sink.add(true);
},
child: SizedBox(
width: 70,
height: 80,
child: Column(
children: [
TileLayer(
urlTemplate: 'https://google-maps.assecutor.de/vt/lyrs=m@130&hl=en&x={x}&y={y}&z={z}',
userAgentPackageName: 'com.example.app',
Container(
height: 50,
width: 70,
color: Colors.transparent,
child: const Icon(
Icons.person_pin_circle,
color: Colors.blue,
size: 56,
),
),
MarkerLayer(
markers: markers,
const SizedBox(height: 2),
SizedBox(
height: 12.0,
width: 70,
child: Text(
"Station ${tour.sort}",
softWrap: true,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.black,
fontSize: 10.0,
),
),
),
StreamBuilder<bool>(
stream: currentStreamController.stream,
builder: (context, snapshot) {
bool tourSelected = tour.sort == currentTour.sort;
if (snapshot.hasData) {
tourSelected = snapshot.data as bool;
}
return Container(
height: 2,
color: tourSelected ? Colors.green : Colors.transparent,
);
}),
],
),
),
),
],
),
),
)
);
},
);
}
);
}
final ValueNotifier<bool> valueNotifier = ValueNotifier<bool>(true);
List<Marker> markers = [];
for (var tour in tourList) {
markers.add(Marker(
builder: (context) => const Icon(Icons.person_pin_circle, size: 56, color: Colors.blue),
point: LatLng(tour.pos!.lat, tour.pos!.long)));
}
return Container(
padding: const EdgeInsets.fromLTRB(30, 0, 30, 0),
key: GlobalKey(),
height: MediaQuery.of(context).size.height * 0.6,
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(8.0),
child: Column(
children: [
SizedBox(
height: 80,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: tourWidgets,
),
)),
Row(
children: [
Expanded(
child: ValueListenableBuilder<bool>(
valueListenable: valueNotifier,
builder: (context, value, child) {
return AnimatedToggleSwitch<bool>.dual(
current: value,
first: true,
second: false,
dif: 0.0,
borderColor: Colors.transparent,
borderWidth: 5.0,
height: 25,
boxShadow: const [
BoxShadow(
color: Colors.black26,
spreadRadius: 1,
blurRadius: 2,
offset: Offset(0, 1.5),
),
],
onChanged: (b) {
valueNotifier.value = b;
mapController.move(mapController.center, b ? 14.0 : 16.0);
},
colorBuilder: (b) => b ? Colors.red : Colors.green,
textBuilder: (value) => value ? const Center(child: Text('Fern')) : const Center(child: Text('Nah')),
);
},
),
),
],
),
const SizedBox(height: 10),
Expanded(
child: AbsorbPointer(
absorbing: true,
child: FlutterMap(
mapController: mapController,
options: MapOptions(
center: LatLng(currentTour.pos!.lat, currentTour.pos!.long),
zoom: 14,
),
children: [
TileLayer(
urlTemplate: 'https://google-maps.assecutor.de/vt/lyrs=m@130&hl=en&x={x}&y={y}&z={z}',
userAgentPackageName: 'com.example.app',
),
MarkerLayer(
markers: markers,
),
],
),
),
),
],
),
),
));
}));
});
}
+48 -56
View File
@@ -1,62 +1,54 @@
import 'package:flutter/material.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:stadtbote/model/task_info.dart';
import 'package:stadtbote/tools/util.dart';
KumiPopupWindow showTaskArrivedPopup(BuildContext context, TaskInfo taskInfo, Function() onFinished) {
return showPopupWindow(
context,
//childSize:Size(240, MediaQuery.of(context).size.width * 0.8),
gravity: KumiPopupGravity.center,
//curve: Curves.elasticOut,
bgColor: Colors.grey.withOpacity(0.5),
clickOutDismiss: true,
clickBackDismiss: true,
customAnimation: false,
customPop: false,
customPage: false,
// targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox),
//needSafeDisplay: true,
underStatusBar: false,
underAppBar: false,
//offsetX: -180,
//offsetY: 50,
duration: const Duration(milliseconds: 200),
onShowStart: (pop) {},
onShowFinish: (pop) {},
onDismissStart: (pop) {},
onDismissFinish: (pop) {},
onClickOut: (pop) {},
onClickBack: (pop) {},
childFun: (pop) {
return SizedBox(
key: GlobalKey(),
height: MediaQuery.of(context).size.height * 0.2,
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: [
Text(taskInfo.task.topic),
const SizedBox(height: 20),
getDefaultButton(taskInfo.task.topic, () => {
onFinished()
}),
],
),
),
));
},
);
showTaskArrivedPopup(BuildContext context, TaskInfo taskInfo, Function() onFinished) async {
await showDialog(
context: context,
builder: (BuildContext context)
{
return AlertDialog(
contentPadding: EdgeInsets.zero,
shadowColor: Colors.transparent,
backgroundColor: Colors.white,
content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
return SizedBox(
key: GlobalKey(),
height: MediaQuery
.of(context)
.size
.height * 0.2,
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: [
Text(taskInfo.task.topic),
const SizedBox(height: 20),
getDefaultButton(taskInfo.task.topic, () =>
{
Navigator.of(context).pop(),
onFinished()
}),
],
),
),
));
}));
});
}
@@ -1,68 +1,53 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:stadtbote/model/task_info.dart';
import 'package:stadtbote/tools/util.dart';
KumiPopupWindow showComissionNumberPopup(BuildContext context, TaskInfo taskInfo, Function(String) onFinished) {
return showPopupWindow(
context,
//childSize:Size(240, MediaQuery.of(context).size.width * 0.8),
gravity: KumiPopupGravity.center,
//curve: Curves.elasticOut,
bgColor: Colors.grey.withOpacity(0.5),
clickOutDismiss: true,
clickBackDismiss: true,
customAnimation: false,
customPop: false,
customPage: false,
// targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox),
//needSafeDisplay: true,
underStatusBar: false,
underAppBar: false,
//offsetX: -180,
//offsetY: 50,
duration: const Duration(milliseconds: 200),
onShowStart: (pop) {},
onShowFinish: (pop) {},
onDismissStart: (pop) {},
onDismissFinish: (pop) {},
onClickOut: (pop) {},
onClickBack: (pop) {},
childFun: (pop) {
TextEditingController textEditingController = TextEditingController();
showComissionNumberPopup(BuildContext context, TaskInfo taskInfo, Function(String) onFinished) async {
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
shadowColor: Colors.transparent,
backgroundColor: Colors.white,
content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
TextEditingController textEditingController = TextEditingController();
return SizedBox(
key: GlobalKey(),
height: 260,
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('Bitte geben Sie die Kommisionsnummer ein'),
const SizedBox(height: 20),
Util.getDefaultTextField('Kommisionsnummer',
type: TextInputType.text, formatter: [FilteringTextInputFormatter.singleLineFormatter], controller: textEditingController, autofocus: true),
const SizedBox(height: 20),
getDefaultButton('Übernehmen', () => {
onFinished(textEditingController.text)
})
],
),
),
));
},
);
return SizedBox(
key: GlobalKey(),
height: 260,
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('Bitte geben Sie die Kommisionsnummer ein'),
const SizedBox(height: 20),
Util.getDefaultTextField('Kommisionsnummer',
type: TextInputType.text,
formatter: [FilteringTextInputFormatter.singleLineFormatter],
controller: textEditingController,
autofocus: true),
const SizedBox(height: 20),
getDefaultButton('Übernehmen', () => {
Navigator.of(context).pop(),
onFinished(textEditingController.text)})
],
),
),
));
}));
});
}
@@ -1,6 +1,4 @@
import 'package:flutter/material.dart';
// ignore: unused_import
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:stadtbote/model/task_info.dart';
import 'package:stadtbote/model/tour_task.dart';
import 'package:stadtbote/tools/util.dart';
@@ -12,7 +10,7 @@ showPickupDeliveryStatusPopup(BuildContext context, TaskInfo taskInfo, Function(
entries.add(dropdownMenuEntry);
}
await showDialog<void>(
await showDialog(
context: context,
builder: (BuildContext context) {
TourEntry? selectedTourEntry;
@@ -1,68 +1,53 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:stadtbote/model/task_info.dart';
import 'package:stadtbote/tools/util.dart';
KumiPopupWindow showReceiptGiverPopup(BuildContext context, TaskInfo taskInfo, Function(String) onFinished) {
return showPopupWindow(
context,
//childSize:Size(240, MediaQuery.of(context).size.width * 0.8),
gravity: KumiPopupGravity.center,
//curve: Curves.elasticOut,
bgColor: Colors.grey.withOpacity(0.5),
clickOutDismiss: true,
clickBackDismiss: true,
customAnimation: false,
customPop: false,
customPage: false,
// targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox),
//needSafeDisplay: true,
underStatusBar: false,
underAppBar: false,
//offsetX: -180,
//offsetY: 50,
duration: const Duration(milliseconds: 200),
onShowStart: (pop) {},
onShowFinish: (pop) {},
onDismissStart: (pop) {},
onDismissFinish: (pop) {},
onClickOut: (pop) {},
onClickBack: (pop) {},
childFun: (pop) {
TextEditingController textEditingController = TextEditingController();
showReceiptGiverPopup(BuildContext context, TaskInfo taskInfo, Function(String) onFinished) async {
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
shadowColor: Colors.transparent,
backgroundColor: Colors.white,
content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
TextEditingController textEditingController = TextEditingController();
return SizedBox(
key: GlobalKey(),
height: 260,
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: [
Text(taskInfo.task.topic),
const SizedBox(height: 20),
Util.getDefaultTextField(taskInfo.task.topic,
type: TextInputType.text, formatter: [FilteringTextInputFormatter.singleLineFormatter], controller: textEditingController, autofocus: true),
const SizedBox(height: 20),
getDefaultButton('Übernehmen', () => {
onFinished(textEditingController.text)
})
],
),
),
));
},
);
return SizedBox(
key: GlobalKey(),
height: 260,
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: [
Text(taskInfo.task.topic),
const SizedBox(height: 20),
Util.getDefaultTextField(taskInfo.task.topic,
type: TextInputType.text,
formatter: [FilteringTextInputFormatter.singleLineFormatter],
controller: textEditingController,
autofocus: true),
const SizedBox(height: 20),
getDefaultButton('Übernehmen', () => {
Navigator.of(context).pop(),
onFinished(textEditingController.text)})
],
),
),
));
}));
});
}
@@ -1,89 +1,56 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:stadtbote/model/task_info.dart';
import 'package:stadtbote/tools/util.dart';
KumiPopupWindow showScanBarcodesPopup(BuildContext context, TaskInfo taskInfo, Function(List<String> barcodes) onFinished) {
return showPopupWindow(
context,
//childSize:Size(240, MediaQuery.of(context).size.width * 0.8),
gravity: KumiPopupGravity.center,
//curve: Curves.elasticOut,
bgColor: Colors.grey.withOpacity(0.5),
clickOutDismiss: true,
clickBackDismiss: true,
customAnimation: false,
customPop: false,
customPage: false,
// targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox),
//needSafeDisplay: true,
underStatusBar: false,
underAppBar: false,
//offsetX: -180,
//offsetY: 50,
duration: const Duration(milliseconds: 200),
onShowStart: (pop) {},
onShowFinish: (pop) {},
onDismissStart: (pop) {},
onDismissFinish: (pop) {},
onClickOut: (pop) {},
onClickBack: (pop) {},
childFun: (pop) {
List<String> scannedBarcodes = [];
showScanBarcodesPopup(BuildContext context, TaskInfo taskInfo, Function(List<String> barcodes) onFinished) async {
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
shadowColor: Colors.transparent,
backgroundColor: Colors.white,
content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
List<String> scannedBarcodes = [];
final ValueNotifier<List<Widget>> scannedBarcodeWidgetsNotifier = ValueNotifier<List<Widget>>([]);
final ValueNotifier<List<Widget>> scannedBarcodeWidgetsNotifier = ValueNotifier<List<Widget>>([]);
List<Widget> createBarcodeWidgets() {
List<Widget> barcodeWidgets = [];
List<Widget> createBarcodeWidgets() {
List<Widget> barcodeWidgets = [];
for(var barcode in scannedBarcodes) {
barcodeWidgets.add(SizedBox(
height: 20,
child: Center(child: Text(barcode)),
));
}
for (var barcode in scannedBarcodes) {
barcodeWidgets.add(SizedBox(
height: 20,
child: Center(child: Text(barcode)),
));
}
return barcodeWidgets;
}
return barcodeWidgets;
}
void scanBarcode() async {
String barcodeScanResult;
try {
barcodeScanResult = await FlutterBarcodeScanner.scanBarcode('#ff6666', 'Abbrechen', true, ScanMode.QR);
void scanBarcode() async {
String barcodeScanResult;
try {
barcodeScanResult = await FlutterBarcodeScanner.scanBarcode('#ff6666', 'Abbrechen', true, ScanMode.QR);
scannedBarcodes.add(barcodeScanResult);
scannedBarcodes.add(barcodeScanResult);
var barcodeWidgets = createBarcodeWidgets();
var barcodeWidgets = createBarcodeWidgets();
scannedBarcodeWidgetsNotifier.value = barcodeWidgets;
} on PlatformException {
barcodeScanResult = 'Failed to get platform version.';
}
}
scannedBarcodeWidgetsNotifier.value = barcodeWidgets;
} on PlatformException {
barcodeScanResult = 'Failed to get platform version.';
}
}
return SizedBox(
key: GlobalKey(),
height: 345,
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('Gescannte Barcodes'),
const SizedBox(height: 20),
Container(
return SizedBox(
key: GlobalKey(),
height: 345,
width: MediaQuery.of(context).size.width * 0.8,
child: Container(
height: 100,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
@@ -92,33 +59,40 @@ KumiPopupWindow showScanBarcodesPopup(BuildContext context, TaskInfo taskInfo, F
width: 0.5,
),
),
height: 100,
child: ValueListenableBuilder<List<Widget>>(
valueListenable: scannedBarcodeWidgetsNotifier,
builder: (context, value, child) {
return ListView(
padding: const EdgeInsets.all(8),
children: value
);
},
child: Padding(
padding: const EdgeInsets.all(35.0),
child: Column(
children: [
const Text('Gescannte Barcodes'),
const SizedBox(height: 20),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
border: Border.all(
color: Colors.grey,
width: 0.5,
),
),
height: 100,
child: ValueListenableBuilder<List<Widget>>(
valueListenable: scannedBarcodeWidgetsNotifier,
builder: (context, value, child) {
return ListView(padding: const EdgeInsets.all(8), children: value);
},
),
),
const SizedBox(height: 20),
getDefaultButton('Hinzufügen', buttonHeight: 50, () => {scanBarcode()}),
const SizedBox(height: 10),
getDefaultButton('Übernehmen', buttonHeight: 50, () => {
Navigator.of(context).pop(),
onFinished(scannedBarcodes)})
],
),
),
),
const SizedBox(height: 20),
getDefaultButton('Hinzufügen', buttonHeight: 50, () => {
scanBarcode()
}),
const SizedBox(height: 10),
getDefaultButton('Übernehmen', buttonHeight: 50, () => {
onFinished(scannedBarcodes)
})
],
),
),
));
},
);
));
}));
});
}
/*
*/
+5 -3
View File
@@ -1,11 +1,10 @@
import 'package:flutter/material.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:signature/signature.dart';
import 'package:stadtbote/model/task_info.dart';
import 'package:stadtbote/tools/util.dart';
showSignaturePopup(BuildContext context, TaskInfo taskInfo, Function() onFinished) async {
await showDialog<void>(
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
@@ -46,7 +45,10 @@ showSignaturePopup(BuildContext context, TaskInfo taskInfo, Function() onFinishe
backgroundColor: Colors.lightBlueAccent,
),
),
getDefaultButton('Übernehmen', buttonHeight: 50, () => {Navigator.of(context).pop(), onFinished()})
getDefaultButton('Übernehmen', buttonHeight: 50, () => {
Navigator.of(context).pop(),
onFinished()})
],
),
),
@@ -1,76 +1,58 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:stadtbote/model/task_info.dart';
import 'package:stadtbote/tools/util.dart';
KumiPopupWindow showStationNoticePopup(BuildContext context, TaskInfo taskInfo, Function(String) onFinished) {
return showPopupWindow(
context,
//childSize:Size(240, MediaQuery.of(context).size.width * 0.8),
gravity: KumiPopupGravity.center,
//curve: Curves.elasticOut,
bgColor: Colors.grey.withOpacity(0.5),
clickOutDismiss: true,
clickBackDismiss: true,
customAnimation: false,
customPop: false,
customPage: false,
// targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox),
//needSafeDisplay: true,
underStatusBar: false,
underAppBar: false,
//offsetX: -180,
//offsetY: 50,
duration: const Duration(milliseconds: 200),
onShowStart: (pop) {},
onShowFinish: (pop) {},
onDismissStart: (pop) {},
onDismissFinish: (pop) {},
onClickOut: (pop) {},
onClickBack: (pop) {},
childFun: (pop) {
TextEditingController textEditingController = TextEditingController();
showStationNoticePopup(BuildContext context, TaskInfo taskInfo, Function(String) onFinished) async {
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
contentPadding: EdgeInsets.zero,
shadowColor: Colors.transparent,
backgroundColor: Colors.white,
content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
TextEditingController textEditingController = TextEditingController();
return SizedBox(
key: GlobalKey(),
height: 280,
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: [
Text(taskInfo.task.topic),
const SizedBox(height: 20),
SizedBox(
height: 100,
child: Util.getDefaultTextField(taskInfo.task.topic,
type: TextInputType.text,
maxLines: 10,
formatter: [FilteringTextInputFormatter.singleLineFormatter],
controller: textEditingController,
autofocus: true),
return SizedBox(
key: GlobalKey(),
height: 280,
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,
),
),
const SizedBox(height: 20),
getDefaultButton('Übernehmen', buttonHeight: 50, () => {onFinished(textEditingController.text)})
],
),
),
));
child: Padding(
padding: const EdgeInsets.all(35.0),
child: Column(
children: [
Text(taskInfo.task.topic),
const SizedBox(height: 20),
SizedBox(
height: 100,
child: Util.getDefaultTextField(taskInfo.task.topic,
type: TextInputType.text,
maxLines: 10,
formatter: [FilteringTextInputFormatter.singleLineFormatter],
controller: textEditingController,
autofocus: true),
),
const SizedBox(height: 20),
getDefaultButton('Übernehmen', buttonHeight: 50, () => {
Navigator.of(context).pop(),
onFinished(textEditingController.text)})
],
),
),
));
}));
},
);
}
/*
*/
@@ -10,7 +10,7 @@ Future<void> showTakePhotosPopup(BuildContext context, TaskInfo taskInfo, Functi
ValueNotifier<List<Widget>> imageWidgetsListNotifier = ValueNotifier<List<Widget>>([]);
await showDialog<void>(
await showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(