🔭

@StateObjectと@ObservedObjectのView間受け渡し観測隊

2023/04/11に公開

結論

受け渡し先で宣言だけのものは渡さないといけない。
受け渡し先でinitしているものでも渡してOK。
@StateObject@ObservedObject 間の受け渡しもOK。

はじめに

この観測は @StateObject@ObservedObject のView間受け渡しを、(私が思う)全パターンを機械的に観測するものである。各パターンに意味があるかどうかは考慮していない。

ソースコード

class TestClass: ObservableObject {
    @Published var value = 0
}

struct ObjectTest1: View {
    
    @StateObject var pSO = TestClass()
    @ObservedObject var pOO = TestClass()

    var body: some View {
        VStack {
	    //ObjectTest2()
            ObjectTest2(cSO_Dec: pSO, cOO_Dec: pOO)
            ObjectTest2(cSO_Dec: pOO, cOO_Dec: pSO)
            ObjectTest2(cSO_Dec: pSO, cSO_Init: pSO, cOO_Dec: pOO, cOO_Init: pOO)
            ObjectTest2(cSO_Dec: pOO, cSO_Init: pOO, cOO_Dec: pOO, cOO_Init: pOO)
        }
    }
}

struct ObjectTest2: View {
    
    @StateObject var cSO_Dec: TestClass
    @StateObject var cSO_Init = TestClass()
    @ObservedObject var cOO_Dec: TestClass
    @ObservedObject var cOO_Init = TestClass()
    
    var body: some View {
        Text("Hello, World!")
    }
}

〜から 〜へ 結果
なし @StateObject 宣言のみ NG
なし @StateObject initあり OK
なし @ObservedObject 宣言のみ NG
なし @ObservedObject initあり OK
@StateObject @StateObject 宣言のみ OK
@StateObject @StateObject initあり OK
@ObservedObject @ObservedObject 宣言のみ OK
@ObservedObject @ObservedObject initあり OK
@StateObject @ObservedObject 宣言のみ OK
@StateObject @ObservedObject initあり OK
@ObservedObject @StateObject 宣言のみ OK
@ObservedObject @StateObject initあり OK

続編

https://zenn.dev/samekard_dev/articles/ede0cfbcec3f12

Discussion