同じクラスの@EnvironmentObjectは複数使用できない

SwiftUI

非常に便利な@EnvironmentObjectですが、1つの型に対して1つのインスタンスしか持てません。

使用しているとなんとなく分かると思いますが、environmentObject()を呼び出す際にはインスタンスを渡すのみであり、キーの設定などは行いません。

また@EnvironmentObjectといて使用する際には、自由に変数名をつけることができます。

このことから、SwiftUIはオブジェクトのクラスを判別し、Environment領域への登録と呼び出しを行っていると考えられます。

実際に試してみましょう。

class ObsObj: ObservableObject {
    @Published var text:String
    
    init(text:String) {
        self.text = text
    }
}
let contentView = ContentView()
                    .environmentObject(ObsObj(text: "Test1"))
                    .environmentObject(ObsObj(text: "Test2"))
struct ContentView: View {
    
    @EnvironmentObject var testObj1:ObsObj
    @EnvironmentObject var testObj2:ObsObj
    
    var body: some View {
        VStack{
            Text(testObj1.text)
            Text(testObj2.text)
        }
    }
}

単純に文字列を保持するクラスを用意し、インスタンスを2個生成しましたが、View側では先に渡したTest1のみが表示されました。

同一のクラスを複数インスタンス扱いたい場合は、上位のクラスを作って中に納める他ないようです。

そもそもモデル設計ちゃんとすれば良いのでは?は無しでお願いします。

コメント

  1. […] […]

タイトルとURLをコピーしました