Implement debounced notification listener updates in MeshCoreConnector

This commit is contained in:
Winston Lowe 2026-02-25 21:58:35 -08:00
parent bdb1eb6b42
commit 2a62390903

View file

@ -127,10 +127,13 @@ class MeshCoreConnector extends ChangeNotifier {
StreamSubscription<List<ScanResult>>? _scanSubscription;
StreamSubscription<BluetoothConnectionState>? _connectionSubscription;
StreamSubscription<List<int>>? _notifySubscription;
Timer? _notifyListenersTimer;
Timer? _selfInfoRetryTimer;
Timer? _reconnectTimer;
Timer? _batteryPollTimer;
int _reconnectAttempts = 0;
bool _notifyListenersDirty = false;
static const Duration _notifyListenersDebounce = Duration(milliseconds: 50);
final StreamController<Uint8List> _receivedFramesController =
StreamController<Uint8List>.broadcast();
@ -3648,11 +3651,46 @@ class MeshCoreConnector extends ChangeNotifier {
}
}
void markNotifyDirty() {
if (_notifyListenersDirty && _notifyListenersTimer != null) {
return;
}
_notifyListenersDirty = true;
_notifyListenersTimer ??= Timer(
_notifyListenersDebounce,
_flushBatchedNotify,
);
}
void _flushBatchedNotify() {
_notifyListenersTimer = null;
if (!_notifyListenersDirty) {
return;
}
_notifyListenersDirty = false;
super.notifyListeners();
if (_notifyListenersDirty && _notifyListenersTimer == null) {
_notifyListenersTimer = Timer(
_notifyListenersDebounce,
_flushBatchedNotify,
);
}
}
@override
void notifyListeners() {
markNotifyDirty();
}
@override
void dispose() {
_scanSubscription?.cancel();
_connectionSubscription?.cancel();
_notifySubscription?.cancel();
_notifyListenersTimer?.cancel();
_reconnectTimer?.cancel();
_batteryPollTimer?.cancel();
_receivedFramesController.close();