描述
我正在尝试将我的应用程序适配到 IOS 16 中引入的新的 NavigationStack
。当我在一个视图中有一个@StateObject
变量时,我遇到了奇怪的行为。
当我使用新的.navigationDestination()
修饰符导航到一个具有@StateObject
的新视图时,该对象的init()
块将运行两次。
该视图的主体看起来像这样:
VStack {
Text("Param: \(intParam) and \(viewModel.someData)")
Button("Do Something") {
viewModel.buttonTapped()
}
}
但是
如果我删除按钮元素,@StateObject
的init()
只会运行一次。
而且
如果我使用旧的NavigationLink(title:destination:)
元素导航到新页面,它将运行一次@StateObject
的init()
。
完整代码
struct ContentView: View {
var body: some View {
NavigationStack {
VStack {
NavigationLink(value: 16) {
Text("Tap Me (IOS 16)")
}
NavigationLink("Tap Me (Older)") {
Page2(intParam: 45)
}
}
.navigationDestination(for: Int.self) { i in
Page2(intParam: i)
}
.navigationTitle("Navigation")
}
}
}
struct Page2: View {
@StateObject var viewModel = ViewModel()
let intParam: Int
init(intParam: Int) {
self.intParam = intParam
print("Page2 view created")
}
var body: some View {
VStack {
Text("Param: \(intParam) and \(viewModel.someData)")
Button("Do Something") {
viewModel.buttonTapped()
}
}
}
}
extension Page2 {
@MainActor class ViewModel: ObservableObject {
@Published var someData = "something"
init() {
print("Page2 viewmodel created")
}
func buttonTapped() {
print("do something")
}
}
}
你有没有想过这种行为的原因?