This commit is contained in:
Sven committed 2025-09-29 14:22:50 +02:00
1 parent 206283c2ca
commit e548f62bde
3 files changed
+31 -6

No files matched your search

@@ -233,6 +233,7 @@ class _AssignedJobsPageState extends State<AssignedJobsPage> 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;
+29 -5
View File
@@ -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<void> showAcceptJobsPopup(SharedMapReference mapReference, Function() onFinished) async {
ExtendendStatefulBuilder extendedStatefulBuilder;
late ExtendendStatefulBuilder extendedStatefulBuilder;
bool builderCreated = false;
bool isActive = true;
return showDialog<void>(
final dialogFuture = showDialog<void>(
barrierDismissible: true,
context: MyApp.appNavigatorKey.currentContext!,
builder: (BuildContext context) {
@@ -58,10 +61,13 @@ Future<void> 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<void> 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<void> 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<void> 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<List<Widget>> _fetchJobWidgets(StateSetter dialogState, Function() onFinished, SharedMapReference mapReference) async {