SwiftUI视图已重新初始化,但主体属性未重新计算,视图未重新呈现

SwiftUI视图已重新初始化,但主体属性未重新计算,视图未重新呈现,swiftui,state,swiftui-state,Swiftui,State,Swiftui State,如何在SwiftUI中重新初始化视图,但不重新计算主体并重新呈现视图 范例 import SwiftUI struct ContentView: View { var body: some View { SubView() .padding() } } struct SubView: View { @State private var items = [Int]() init() {

如何在SwiftUI中重新初始化视图,但不重新计算主体并重新呈现视图


范例

import SwiftUI

struct ContentView: View {
    var body: some View {
        SubView()
            .padding()
    }
}

struct SubView: View {
    
    @State private var items = [Int]()
    
    init() {
        print("SubView init")
    }
    
    var body: some View {
        Text("\(items.count)")
        Button("Add item") { items.append(Int.random(in: 0..<10)) }
        Divider()
        SubSubView()
        SubSubView()
    }
}

struct SubSubView: View {
    init() {
        print("SubSubView init")
    }
    
    var body: some View {
        Text("I'm a subview") (>> _breakpoint here_)
    }
}
SubSubView
body
属性未重新计算(使用断点)。
这个子视图是否只有在视图依赖关系发生任何变化时才重新呈现,即使它再次被初始化?

现在,我不是专家,也没有这方面的任何来源,但我可以想象它是这样的:

更改
items
变量时,SwiftUI必须找出哪些子视图取决于该值,以便使用正确(更新)的值重新渲染它们。确定对象是否已更改的一个简单方法是通过。因此,我认为SwiftUI(内部)会重新初始化视图,计算结构上的哈希值,如果它与当前视图的哈希值不同,则会重新呈现。否则,
项的更改不会影响视图,因此不需要重新渲染


编辑:为清楚起见,当对象的其余部分被初始化时,计算属性(如
body
)不会被初始化。它是按需计算的。这就是为什么您还可以在其中使用其他变量。

这是SwiftUI渲染器优化-它创建视图值(因为它是结构),但只有在上次绘制后发生了一些更改时才重新渲染(调用主体)。如果您能告诉我们为什么需要重新初始化视图,那将更有帮助,因为我认为这是不可能的,或者至少不是强制重新渲染的好做法SwiftUI@thisIsTheFoxe实际上,我更想理解结构和视图之间的生命周期是如何不同的。还要了解当重新呈现ContentView时,
子视图(如ViewModel)中的属性何时以及为什么会重新初始化(例如,如果我为
视图
提供自定义Init(),则该属性可能会重新初始化,除非我使用
@StateObject
属性包装器)。
SubView init (>> app launch)
SubSubView init (>> app launch)
SubSubView init (>> app launch)
SubSubView init
SubSubView init
SubSubView init
SubSubView init
SubSubView init
SubSubView init
SubSubView init
SubSubView init