diff --git a/packages/react-native-mmkv/cpp/HybridMMKV.cpp b/packages/react-native-mmkv/cpp/HybridMMKV.cpp index e4b3dc31..c448468a 100644 --- a/packages/react-native-mmkv/cpp/HybridMMKV.cpp +++ b/packages/react-native-mmkv/cpp/HybridMMKV.cpp @@ -162,11 +162,17 @@ std::vector HybridMMKV::getAllKeys() { return instance->allKeys(); } void HybridMMKV::clearAll() { + auto mmkvID = instance->mmapID(); + + if (!MMKVValueChangedListenerRegistry::hasListeners(mmkvID)) { + instance->clearAll(); + return; + } + auto keysBefore = getAllKeys(); instance->clearAll(); for (const auto& key : keysBefore) { - // Notify on changed - MMKVValueChangedListenerRegistry::notifyOnValueChanged(instance->mmapID(), key); + MMKVValueChangedListenerRegistry::notifyOnValueChanged(mmkvID, key); } } void HybridMMKV::recrypt(const std::optional& key) { diff --git a/packages/react-native-mmkv/cpp/MMKVValueChangedListenerRegistry.cpp b/packages/react-native-mmkv/cpp/MMKVValueChangedListenerRegistry.cpp index 1f1b21a4..e2e39744 100644 --- a/packages/react-native-mmkv/cpp/MMKVValueChangedListenerRegistry.cpp +++ b/packages/react-native-mmkv/cpp/MMKVValueChangedListenerRegistry.cpp @@ -41,6 +41,14 @@ void MMKVValueChangedListenerRegistry::removeListener(const std::string& mmkvID, listeners.end()); } +bool MMKVValueChangedListenerRegistry::hasListeners(const std::string& mmkvID) { + auto entry = _listeners.find(mmkvID); + if (entry == _listeners.end()) { + return false; + } + return !entry->second.empty(); +} + void MMKVValueChangedListenerRegistry::notifyOnValueChanged(const std::string& mmkvID, const std::string& key) { // 1. Get all listeners for the specific MMKV ID auto entry = _listeners.find(mmkvID); diff --git a/packages/react-native-mmkv/cpp/MMKVValueChangedListenerRegistry.hpp b/packages/react-native-mmkv/cpp/MMKVValueChangedListenerRegistry.hpp index 1ab1641e..7e3a7b08 100644 --- a/packages/react-native-mmkv/cpp/MMKVValueChangedListenerRegistry.hpp +++ b/packages/react-native-mmkv/cpp/MMKVValueChangedListenerRegistry.hpp @@ -31,6 +31,7 @@ class MMKVValueChangedListenerRegistry final { public: static ListenerID addListener(const std::string& mmkvID, const std::function& callback); static void removeListener(const std::string& mmkvID, ListenerID id); + static bool hasListeners(const std::string& mmkvID); public: static void notifyOnValueChanged(const std::string& mmkvID, const std::string& key);