Inconsistent subviews redrawing in LazyVStack

Hello Apple forum !

I spotted a weird behaviour with LazyVStack in a ScrollView. I understand that it loads its views only once upon appearance unlinke VStack that loads everything in one shot.

What I noticed also, it seems to reload its views sometimes when scrolling back up to earlier loaded views. The thing is, it isn't always the case.

struct LazyVStackTest: View {
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(0..<1000, id: \.self) { _ in
                  //  if true {
                        MyText()
                  //  }
                }
            }
        }
    }
    
    struct MyText: View {
        var body: some View {
            let _ = Self._printChanges()
            HStack {
                Text("hello")
            }
        }
    }
}

If we consider the code above on XCode 26 beta 7 on an iOS 26 or iOS 18.2 simulator.

  • Scroll to the bottom : you'll see one "LazyVStackTest.MyText: @self changed" for each row.
  • Then scroll back up to the top, we'll see again the same message printed multiple times.

--> So I gather from this that LazyVStack not only loads lazily but also removes old rows from memory & recreates them upon reappearance.

What I don't get however is that if you uncomment the "if true" statement, you won't see the reloading happening. And I have absolutely no clue as to why 😅

If someone could help shed some light on this weird behaviour, it would be greatly appreciated ^^

PS : the issue is also present with XCode 16.2 but at a deeper lever (ex: if we embed another custom View "MyText2" inside "MyText", the reloading is in "MyText2" & not "MyText")

Inconsistent subviews redrawing in LazyVStack
 
 
Q