为什么视图修饰符不能接受不可变变量?
Why view modifier can't take in immutable variable?
我做了一个按钮修改器,背景颜色应该根据是否被点击而改变。但是我抱怨 viewModifier 的输入参数是不可变的。
我在
的 btnBkColor 上出错
.modifier(ActionButtonType(bkColor: btnBkColor))
错误消息:
Cannot use mutating getter on immutable value: 'self' is immutable
这是我的简化代码:
struct MyView: View {
@State private var cond = false
private lazy var btnBkColor: Color = cond ? Color.orange : Color.green
var body: some View {
Button(action: { cond.toggle() }, label: {
Text(cond ? "A" : "B")
})
.modifier(ActionButtonType(bkColor: btnBkColor))
}
}
修改器:
struct ActionButtonType: ViewModifier {
let bkColor: Color
func body(content: Content) -> some View {
content
.background(bkColor)
}
}
我在ViewModifier里面只获取btnBkColor没有设置,不明白为什么入参不能不可变?
我试过但没有帮助的:
- 将 let 更改为 var
- 在btnBkColor前面添加@State
非常感谢您。
使用计算属性。不能直接用self变量给other变量。
struct MyView: View {
@State private var cond = false
private var btnBkColor: Color {
cond ? Color.orange : Color.green
} // <--Here
var body: some View {
Button(action: { cond.toggle() }, label: {
Text(cond ? "A" : "B")
})
.modifier(ActionButtonType(bkColor: btnBkColor))
}
}
最简单的情况,也是 SwiftUI 代码中最常用的情况,是使用修饰符的状态依赖内联(这也将是可动画的 when/if 需要)
struct MyView: View {
@State private var cond = false
var body: some View {
Button(action: { cond.toggle() }, label: {
Text(cond ? "A" : "B")
})
.modifier(ActionButtonType(bkColor: cond ? Color.orange : Color.green))
}
}
我做了一个按钮修改器,背景颜色应该根据是否被点击而改变。但是我抱怨 viewModifier 的输入参数是不可变的。
我在
的 btnBkColor 上出错.modifier(ActionButtonType(bkColor: btnBkColor))
错误消息:
Cannot use mutating getter on immutable value: 'self' is immutable
这是我的简化代码:
struct MyView: View {
@State private var cond = false
private lazy var btnBkColor: Color = cond ? Color.orange : Color.green
var body: some View {
Button(action: { cond.toggle() }, label: {
Text(cond ? "A" : "B")
})
.modifier(ActionButtonType(bkColor: btnBkColor))
}
}
修改器:
struct ActionButtonType: ViewModifier {
let bkColor: Color
func body(content: Content) -> some View {
content
.background(bkColor)
}
}
我在ViewModifier里面只获取btnBkColor没有设置,不明白为什么入参不能不可变?
我试过但没有帮助的:
- 将 let 更改为 var
- 在btnBkColor前面添加@State
非常感谢您。
使用计算属性。不能直接用self变量给other变量。
struct MyView: View {
@State private var cond = false
private var btnBkColor: Color {
cond ? Color.orange : Color.green
} // <--Here
var body: some View {
Button(action: { cond.toggle() }, label: {
Text(cond ? "A" : "B")
})
.modifier(ActionButtonType(bkColor: btnBkColor))
}
}
最简单的情况,也是 SwiftUI 代码中最常用的情况,是使用修饰符的状态依赖内联(这也将是可动画的 when/if 需要)
struct MyView: View {
@State private var cond = false
var body: some View {
Button(action: { cond.toggle() }, label: {
Text(cond ? "A" : "B")
})
.modifier(ActionButtonType(bkColor: cond ? Color.orange : Color.green))
}
}