SwiftUI视图已重新初始化,但主体属性未重新计算,视图未重新呈现
如何在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() {
范例
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_)
}
}
SubSubViewbody
属性未重新计算(使用断点)。
这个子视图是否只有在视图依赖关系发生任何变化时才重新呈现,即使它再次被初始化?现在,我不是专家,也没有这方面的任何来源,但我可以想象它是这样的: 更改
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