diff --git a/lib/content_views/assigned_jobs_page.dart b/lib/content_views/assigned_jobs_page.dart index 71ce931..fd706b5 100644 --- a/lib/content_views/assigned_jobs_page.dart +++ b/lib/content_views/assigned_jobs_page.dart @@ -233,6 +233,7 @@ class _AssignedJobsPageState extends State with ProducerMixin, message.track = Track(); message.track.time = Util.nowUnixSecondsUtc(); message.track.pos = FinTaskPos(); + message.track.pos!.time = currentPosition != null ? Util.toUnixSecondsUtc(currentPosition.timestamp) : 0; message.track.pos!.lat = currentPosition != null ? currentPosition.latitude : 0.0; message.track.pos!.long = currentPosition != null ? currentPosition.longitude : 0.0; message.track.pos!.acc = currentPosition != null ? currentPosition.accuracy.toInt() : 0; diff --git a/lib/popups/accept_jobs_popup.dart b/lib/popups/accept_jobs_popup.dart index d151ef5..a82d568 100644 --- a/lib/popups/accept_jobs_popup.dart +++ b/lib/popups/accept_jobs_popup.dart @@ -14,15 +14,18 @@ import 'package:stadtbote/tools/messages/job_received_message.dart'; import 'package:stadtbote/tools/messages/refresh_badges_message.dart'; import 'package:stadtbote/tools/messages/remove_job_message.dart'; import 'package:stadtbote/tools/util.dart'; +import 'package:expandable/expandable.dart'; import '../tools/messages/publish_payload_message.dart'; final ScrollController _scrollController = ScrollController(); Future showAcceptJobsPopup(SharedMapReference mapReference, Function() onFinished) async { - ExtendendStatefulBuilder extendedStatefulBuilder; + late ExtendendStatefulBuilder extendedStatefulBuilder; + bool builderCreated = false; + bool isActive = true; - return showDialog( + final dialogFuture = showDialog( barrierDismissible: true, context: MyApp.appNavigatorKey.currentContext!, builder: (BuildContext context) { @@ -58,10 +61,13 @@ Future showAcceptJobsPopup(SharedMapReference mapReference, Function() onF )); }); + builderCreated = true; + extendedStatefulBuilder.subscribe( queueId: Constants.messageTopicJobReceived, callback: (message) { var jobReceivedMessage = message.payload as JobReceivedMessage; + if (!isActive || extendedStatefulBuilderStateSetter == null) return; if (jobReceivedMessage.job.state == 0) { extendedStatefulBuilderStateSetter!(() {}); } @@ -72,10 +78,10 @@ Future showAcceptJobsPopup(SharedMapReference mapReference, Function() onF queueId: Constants.messageTopicJobDeleted, callback: (message) { var jobDeletedMessage = message.payload as JobDeletedMessage; + if (!isActive || extendedStatefulBuilderStateSetter == null) return; if (jobDeletedMessage.job.state == 0) { extendedStatefulBuilderStateSetter!(() {}); } - extendedStatefulBuilderStateSetter!(() {}); }, ); @@ -104,8 +110,11 @@ Future showAcceptJobsPopup(SharedMapReference mapReference, Function() onF ), ), getDefaultButton("Liste schliessen", () { - extendedStatefulBuilder.unsubscribe(queueId: Constants.messageTopicJobReceived); - extendedStatefulBuilder.unsubscribe(queueId: Constants.messageTopicJobDeleted); + isActive = false; + if (builderCreated) { + extendedStatefulBuilder.unsubscribe(queueId: Constants.messageTopicJobReceived); + extendedStatefulBuilder.unsubscribe(queueId: Constants.messageTopicJobDeleted); + } Navigator.pop(context); @@ -120,6 +129,21 @@ Future showAcceptJobsPopup(SharedMapReference mapReference, Function() onF ); }, ); + + // Ensure we always clean up subscriptions even if the dialog is dismissed via barrier tap or back button + dialogFuture.whenComplete(() { + isActive = false; + if (builderCreated) { + try { + extendedStatefulBuilder.unsubscribe(queueId: Constants.messageTopicJobReceived); + extendedStatefulBuilder.unsubscribe(queueId: Constants.messageTopicJobDeleted); + } catch (_) { + // ignore cleanup errors + } + } + }); + + return dialogFuture; } Future> _fetchJobWidgets(StateSetter dialogState, Function() onFinished, SharedMapReference mapReference) async { diff --git a/pubspec.yaml b/pubspec.yaml index b5ff200..d3d8a1c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 346.0.0+346 +version: 347.0.0+347 environment: sdk: '>=3.5.0 <4.0.0'