0

我试图弄清楚@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”日志。此时计数器也被丢弃。它打算如何工作?

4

0 回答 0