fixed (iOS) Relayout not Working for Nested Inline #41352
                
     Closed
            
            
          
  Add this suggestion to a batch that can be applied as a single commit.
  This suggestion is invalid because no changes were made to the code.
  Suggestions cannot be applied while the pull request is closed.
  Suggestions cannot be applied while viewing a subset of changes.
  Only one suggestion per line can be applied in a batch.
  Add this suggestion to a batch that can be applied as a single commit.
  Applying suggestions on deleted lines is not supported.
  You must change the existing code in this line in order to create a valid suggestion.
  Outdated suggestions cannot be applied.
  This suggestion has been applied or marked resolved.
  Suggestions cannot be applied from pending reviews.
  Suggestions cannot be applied on multi-line comments.
  Suggestions cannot be applied while the pull request is queued to merge.
  Suggestion cannot be applied right now. Please check back later.
  
    
  
    
Summary:
React Native, the text inline is made versatile by design. Being managed in an alien layout logic (i.e., text paragraph), inline views work seamlessly as if in normal flex layout. The capacities such as animation and relayout, however, requires extra efforts on native layer.
This PR fixed one critical issue for inline, i.e.,
setState()is not working when inline contains nested views.Closes #41348
Demo (Fixed)
Screen.Recording.2023-11-07.at.20.42.57.mov
Problem in technical:
This issue is caused by a bug in
RCTShadowView::sizeThatFitsMinimumSize()which accidentally unlink children (of yoga nodes) with their parent (owner). More specifically, on the critical path, itYGNodeCalculateLayout()using the cloned nodeYGNodeFree()One unseen implication of
YGNodeFree()is to unlink all its children (because of the shallow clone)Next, let's examine,
How nullptr of owner can cause the broken
setState()of nested inline viewsThe orphan children has two consequences:
a. the changes on child node (
setState()) cannot be propagated to the parent (YGNodeMarkDirty->node->markDirtyAndPropagate(););b.
YGNodeCalculateLayout()(yoga::calculateLayoutImpl) will create new children instances when orphan is detected (see below)Both compounded are contributing the failed
setState(). Respectively,a causes early return of
YGNodeCalculateLayout()because parent is recognized as not dirty;b clones a new dirty node which replaces the child which is supposed to be cleaned within
YGNodeCalculateLayout(). And this is the dirty node detected by the assertion mentioned in the issue description #41348.The fix:
The fix introduced in this PR is to relink the children with their parent in
RCTShadowView::sizeThatFitsMinimumSize()Changelog:
[IOS] [FIXED] -
setStateis not working for nested inline views in textTest Plan:
Test directly in rn-tester
https://docs.google.com/spreadsheets/d/1IJg64d27p3JXiGrDYgqEGyroDn8mk4KgI-LISUOSEQg/edit?usp=sharing