我试图弄清楚@StateObject 在 swiftUI 中是如何工作的。根据文档文档(https://developer.apple.com/documentation/swiftui/stateobject):
SwiftUI 只为声明对象的结构的每个实例创建一次对象的新实例
所以我写了简单的例子:
class Model: ObservableObject {
@Published var counter: Int = 0
init() {
print("init called")
}
}
struct Counter: View {
@StateObject var model = Model()
var body: some View {
VStack {
Text("\(model.counter)")
Button(action: {
self.model.counter+=1
}, label: {
Text("Button")
})
}
}
}
struct ContentView: View {
@State var model = [1]
var body: some View {
NavigationView{
VStack {
List(model, id: \.self) { i in
NavigationLink(
destination: Counter(),
label: {
Text("\(i)")
})
}
Button(action: {
model.append(2)
}, label: {
Text("Button")
})
}
}
}
}
但是,如果我导航到计数器,多次按下按钮并再次来回导航,我的值将被删除,并且控制台显示,@StataObject 的初始化程序被调用了两次。所以每次我导航到它时似乎都会重新创建 Counter() 。
我的第一个问题是如何防止 NavigationView 这样做?如何告诉它,我的计数器是相同的,不应该从头开始重新创建?
当我将@StateObject 更改为@ObservedObject 时,会出现第二个问题。在这种情况下,应用程序按我的计划工作:计数器存储计数值。但是,如果我点击屏幕底部的按钮并将新元素添加到列表中,所有列表实体都会重新创建,并且控制台会显示多个“init”日志。此时计数器也被丢弃。它打算如何工作?