diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index 8f42d2e..c00b4ca 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -130,10 +130,13 @@ class MeshCoreConnector extends ChangeNotifier { StreamSubscription>? _scanSubscription; StreamSubscription? _connectionSubscription; StreamSubscription>? _notifySubscription; + Timer? _notifyListenersTimer; Timer? _selfInfoRetryTimer; Timer? _reconnectTimer; Timer? _batteryPollTimer; int _reconnectAttempts = 0; + bool _notifyListenersDirty = false; + static const Duration _notifyListenersDebounce = Duration(milliseconds: 50); final StreamController _receivedFramesController = StreamController.broadcast(); @@ -3765,11 +3768,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();