@@ -271,32 +271,9 @@ void HybridStyleSheet::onPlatformDependenciesChange(std::vector<UnistyleDependen
271271 return ;
272272 }
273273
274- auto & registry = core::UnistylesRegistry::get ();
275- auto parser = parser::Parser (self->_unistylesRuntime );
276274 auto unistyleDependencies = dependencies;
277- auto dependencyMap = registry.buildDependencyMap (unistyleDependencies);
278-
279- if (dependencyMap.empty ()) {
280- self->notifyJSListeners (unistyleDependencies);
281- }
282-
283- // in a later step, we will rebuild only Unistyles with mounted StyleSheets
284- // however, user may have StyleSheets with components that haven't mounted yet
285- // we need to rebuild all dependent StyleSheets as well
286- auto dependentStyleSheets = registry.getStyleSheetsToRefresh (unistyleDependencies);
287-
288- parser.rebuildUnistylesInDependencyMap (rt, dependencyMap, dependentStyleSheets, std::nullopt );
289-
290- // we need to stop here if there is nothing to update at the moment,
291- // but we need to compute dependentStyleSheets
292- if (dependencyMap.empty ()) {
293- return ;
294- }
295-
296- parser.rebuildShadowLeafUpdates (rt, dependencyMap);
297275
298- self->notifyJSListeners (unistyleDependencies);
299- shadow::ShadowTreeManager::updateShadowTree (rt);
276+ self->applyDependencyChanges (rt, unistyleDependencies, std::nullopt );
300277 });
301278}
302279
@@ -316,7 +293,6 @@ void HybridStyleSheet::onPlatformNativeDependenciesChange(std::vector<UnistyleDe
316293 }
317294
318295 auto & registry = core::UnistylesRegistry::get ();
319- auto parser = parser::Parser (self->_unistylesRuntime );
320296 auto unistyleDependencies = std::move (dependencies);
321297
322298 // re-compute new breakpoint
@@ -339,29 +315,7 @@ void HybridStyleSheet::onPlatformNativeDependenciesChange(std::vector<UnistyleDe
339315 self->_unistylesRuntime ->includeDependenciesForColorSchemeChange (unistyleDependencies);
340316 }
341317
342- auto dependencyMap = registry.buildDependencyMap (unistyleDependencies);
343-
344- if (dependencyMap.empty ()) {
345- self->notifyJSListeners (unistyleDependencies);
346- }
347-
348- // in a later step, we will rebuild only Unistyles with mounted StyleSheets
349- // however, user may have StyleSheets with components that haven't mounted yet
350- // we need to rebuild all dependent StyleSheets as well
351- auto dependentStyleSheets = registry.getStyleSheetsToRefresh (unistyleDependencies);
352-
353- parser.rebuildUnistylesInDependencyMap (rt, dependencyMap, dependentStyleSheets, miniRuntime);
354-
355- // we need to stop here if there is nothing to update at the moment,
356- // but we need to compute dependentStyleSheets
357- if (dependencyMap.empty ()) {
358- return ;
359- }
360-
361- parser.rebuildShadowLeafUpdates (rt, dependencyMap);
362-
363- self->notifyJSListeners (unistyleDependencies);
364- shadow::ShadowTreeManager::updateShadowTree (rt);
318+ self->applyDependencyChanges (rt, unistyleDependencies, miniRuntime);
365319 });
366320}
367321
@@ -380,26 +334,36 @@ void HybridStyleSheet::onImeChange(UnistylesNativeMiniRuntime miniRuntime) {
380334 }
381335
382336 std::vector<UnistyleDependency> dependencies{UnistyleDependency::IME};
383- auto & registry = core::UnistylesRegistry::get ();
384- auto parser = parser::Parser (self->_unistylesRuntime );
385- auto dependencyMap = registry.buildDependencyMap (dependencies);
386337
387- if (dependencyMap.empty ()) {
388- self->notifyJSListeners (dependencies);
338+ self->applyDependencyChanges (rt, dependencies, miniRuntime);
339+ });
340+ }
389341
390- return ;
391- }
342+ void HybridStyleSheet::applyDependencyChanges (jsi::Runtime& rt, std::vector<UnistyleDependency>& dependencies, std::optional<UnistylesNativeMiniRuntime> maybeMiniRuntime) {
343+ auto & registry = core::UnistylesRegistry::get ();
344+ auto parser = parser::Parser (this ->_unistylesRuntime );
345+ auto dependencyMap = registry.buildDependencyMap (dependencies);
346+
347+ // include StyleSheets consumed only by JS (withUnistyles) — they aren't in dependencyMap
348+ // but their rawValue must still be refreshed so rerenders read fresh closures
349+ auto dependentStyleSheets = registry.getStyleSheetsToRefresh (dependencies);
350+
351+ if (dependencyMap.empty () && dependentStyleSheets.empty ()) {
352+ return ;
353+ }
392354
393- // we don't care about other unmounted stylesheets as their not visible
394- // so user won't see any changes
395- std::vector<std::shared_ptr<core::StyleSheet>> dependentStyleSheets;
355+ // rebuild rawValue BEFORE notifying listeners so JS rerenders read fresh closures
356+ parser.rebuildUnistylesInDependencyMap (rt, dependencyMap, dependentStyleSheets, maybeMiniRuntime);
396357
397- parser. rebuildUnistylesInDependencyMap (rt, dependencyMap, dependentStyleSheets, miniRuntime);
358+ if (! dependencyMap. empty ()) {
398359 parser.rebuildShadowLeafUpdates (rt, dependencyMap);
360+ }
361+
362+ this ->notifyJSListeners (dependencies);
399363
400- self-> notifyJSListeners (dependencies);
364+ if (!dependencyMap. empty ()) {
401365 shadow::ShadowTreeManager::updateShadowTree (rt);
402- });
366+ }
403367}
404368
405369void HybridStyleSheet::notifyJSListeners (std::vector<UnistyleDependency>& dependencies) {
0 commit comments