Matthias Nott
2026-04-01 59a9917225dd64cdc77bfcd3b280054728b26cd1
lib/screens/chat_screen.dart
....@@ -20,6 +20,7 @@
2020 import '../services/audio_service.dart';
2121 import '../services/message_store.dart';
2222 import '../services/mqtt_service.dart';
23
+import '../services/navigate_notifier.dart';
2324 import '../services/push_service.dart';
2425 import '../theme/app_theme.dart';
2526 import '../widgets/command_bar.dart';
....@@ -61,6 +62,8 @@
6162 int _lastSeq = 0;
6263 bool _isCatchingUp = false;
6364 bool _screenshotForChat = false;
65
+ // FIFO dedup queue: O(1) eviction by removing from front when over cap.
66
+ final List<int> _seenSeqsList = [];
6467 final Set<int> _seenSeqs = {};
6568 bool _sessionReady = false;
6669 final List<Map<String, dynamic>> _pendingMessages = [];
....@@ -222,7 +225,7 @@
222225 debugPrint('MQTT error: $error');
223226 };
224227
225
- NavigateNotifier.instance = NavigateNotifier(
228
+ ref.read(navigateNotifierProvider.notifier).state = NavigateNotifier(
226229 sendKey: (key, sessionId) {
227230 _sendCommand('nav', {'key': key});
228231 },
....@@ -262,10 +265,11 @@
262265 // Dedup: skip messages we've already processed
263266 if (_seenSeqs.contains(seq)) return;
264267 _seenSeqs.add(seq);
265
- // Keep set bounded
266
- if (_seenSeqs.length > 500) {
267
- final sorted = _seenSeqs.toList()..sort();
268
- _seenSeqs.removeAll(sorted.sublist(0, sorted.length - 300));
268
+ _seenSeqsList.add(seq);
269
+ // Keep bounded at 500 with O(1) FIFO eviction (drop oldest first)
270
+ if (_seenSeqsList.length > 500) {
271
+ final evict = _seenSeqsList.removeAt(0);
272
+ _seenSeqs.remove(evict);
269273 }
270274 if (seq > _lastSeq) {
271275 _lastSeq = seq;