为什么使用EnvironmentKey的ViewModifier未生效?
为什么使用EnvironmentKey的ViewModifier未生效?
嘿,我仔细瞅了你的代码,问题根源其实在环境变量的传递逻辑上!
你现在是在MyView内部的Text上设置了环境变量,但.bordered()修饰符是加在MyView本身的外面。要知道SwiftUI的环境变量是从父视图向子视图单向传递的——你在子视图(Text)里设置的环境,根本不会反向影响到它的父级(MyView),所以BorderedModifier拿到的始终是EnvironmentKey的默认值:.black和false,自然就看不到你想要的红色边框效果了。
那怎么改呢?很简单,把环境变量的设置移到MyView的层级上,而不是内部的Text:
struct MyView: View { let value: String let color: Color let border: Bool var body: some View { Text(value) .foregroundStyle(color) } // 把环境设置放在MyView的外面,让整个MyView的环境带上这些值 .environment(\.borderColor, color) .environment(\.isBorderEnabled, border) }
这样修改后,当你在ContentView里给MyView加.bordered()时,BorderedModifier所在的环境就是MyView的环境,就能正确读取到你传入的color和border参数了,边框效果也就正常生效啦。
顺带说一句,你的EnvironmentKey定义和ViewModifier的逻辑都是对的,只是环境变量的设置位置搞错了,调整一下层级就解决问题~
备注:内容来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

