📑
SwiftUIのEnvironmentValuesはsheetやfullScreenCoverを挟んでも継承される
どうやら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()
}
Discussion