为什么视图修饰符不能接受不可变变量?

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没有设置,不明白为什么入参不能不可变?

我试过但没有帮助的:

非常感谢您。

使用计算属性。不能直接用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))
  }
}