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

问题描述

我做了一个按钮修饰符,背景颜色应该根据它是否被点击而改变。但是我抱怨 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

非常感谢您。

解决方法

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

最简单的情况,也是 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))
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...