如何在 SwiftUI 中设置自定义环境键? [英] How to set a custom environment key in SwiftUI?
问题描述
创建自定义环境键有效,但如果我希望在视图中设置该值,XCODE 不允许这样做.但是可以设置预定义的环境值.我做错了什么?
Creating a custom environment key works, but if I wish to set the value in a view, XCODE doesn't allow it. But the predefined environment values can be set. What am I doing wrong?
struct ResetDefault: EnvironmentKey {
static var defaultValue: Bool = false
}
extension EnvironmentValues {
var resetDefault: Bool {
get { self[ResetDefault.self] }
set { self[ResetDefault.self] = newValue }
}
}
struct ResetView: View {
@Environment(\.resetDefault) var reset
var body: some View {
Text("Reset").onAppear() {
reset = true. // Cannot assign to property: 'reset' is a get-only property
}
}
}
推荐答案
Environment
用于在 parent > 中传递值.child
方向,因此设置值以供使用.如果您想更改环境值的内部,那么您需要以某种方式包装它,可能的变体是绑定或引用类型持有者.
The Environment
is used to pass values in parent > child
direction, so value is set for usage. If you want to change internal of environment value then you need to wrap it somehow, possible variants are binding or reference type holder.
这里是一个基于绑定的用法示例(类似于 .editMode 和 .presentationMode 的工作方式)
Here is an example of usage based on binding (similar to how .editMode and .presentationMode work)
struct TestResetEnv: View {
@State private var isActive = false
@State private var reset = false
var body: some View {
VStack {
Text("Current: \(reset ? "true" : "false")")
Button("Go") { self.isActive.toggle() }
if isActive {
ResetView()
}
}.environment(\.resetDefault, $reset) // set for children as env!!
}
}
struct ResetDefault: EnvironmentKey {
static var defaultValue: Binding<Bool> = .constant(false)
}
extension EnvironmentValues {
var resetDefault: Binding<Bool> {
get { self[ResetDefault.self] }
set { self[ResetDefault.self] = newValue }
}
}
struct ResetView: View {
@Environment(\.resetDefault) var reset
var body: some View {
Text("Reset").onAppear() {
self.reset.wrappedValue.toggle() // << change wrapped !!
}
}
}
这篇关于如何在 SwiftUI 中设置自定义环境键?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!