2

我做了一个按钮修饰符,背景颜色应该根据它是否被点击而改变。但我抱怨 viewModifier 的输入参数是不可变的。

我在btnBkColor上遇到错误

.modifier(ActionButtonType(bkColor: btnBkColor))

错误消息:

不能对不可变值使用变异 getter:'self' 是不可变的

这是我的简化代码:

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

非常感谢您提前。

4

2 回答 2

2

使用计算属性。您不能将 self 变量直接用于其他变量。

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))
    }
}
于 2021-02-22T09:20:00.083 回答
2

最简单的情况,也是 SwiftUI 代码中最常使用的情况,是使用修饰符的状态依赖内联(如果需要,这也将是可动画的)

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))
  }
}
于 2021-02-22T09:45:12.933 回答