📑

SwiftUIのEnvironmentValuesはsheetやfullScreenCoverを挟んでも継承される

2024/08/12に公開

どうやらXcode12.0周辺で「modalを挟むと親子関係が途切れるのでEnvironmentValuesが伝播しない」というバグがあって、のちに修正されたものの修正前の挙動で書かれた記事とかもあってややこしいので、手元で簡単に検証した結果とサンプルコードを示します。

結果

EnvironmentValuesはmodal(.sheet, .fullScreenCoverなど)を挟んでも継承される

サンプルコード

モーダルの外側のビューで.environment(\.isTestEnabled, true)を注入していますが、Modalでは"Enabled"が表示されます。

import SwiftUI

struct ContentView: View {
    
    @State private var isPresented: Bool = false
    var body: some View {
        VStack {
            Button("Open") {
                isPresented = true
            }
            .sheet(isPresented: $isPresented) {
                Modal()
            }
        }
        .padding()
        .environment(\.isTestEnabled, true)
    }
}

struct Modal: View {
    @Environment(\.isTestEnabled) var enabled
    
    var body: some View {
        Text(enabled ? "Enabled" : "Disabled")
    }
    
}

extension EnvironmentValues {
    @Entry var isTestEnabled: Bool = false
}

#Preview {
    ContentView()
}

参考

GitHubで編集を提案

Discussion