为啥自定义 SwiftUI 视图不响应状态变化
Posted
技术标签:
【中文标题】为啥自定义 SwiftUI 视图不响应状态变化【英文标题】:Why doesn't custom SwiftUI view react to state changes为什么自定义 SwiftUI 视图不响应状态变化 【发布时间】:2021-07-07 15:14:30 【问题描述】:我在 SwiftUI 中使用许多不同的自定义视图都遇到过这个问题,那么为什么会有这样的代码
struct HeaderText: View
@State var text: String
@State var color: Color
var body: some View
Text(text)
.font(.custom("Gilroy-SemiBold", size: 20))
.foregroundColor(color)
text
或 color
更改时不会自动更新。例如,如果我有这样的视图
struct ContentView: View
@State var text = "Hello"
var body: some View
VStack
HeaderText(text: self.text, color: .black)
Button("Change Text")
self.text = "Goodbye"
我原以为视图会使用新文本进行更新,但事实并非如此。我知道您可以使用@Binding
完成此操作,但我正在寻找更优雅的解决方案,类似于Text
的工作方式。我只是使用这些视图和structs
作为示例,所以我知道这些可能不是一般的最佳做法。
感谢您的帮助!
【问题讨论】:
【参考方案1】:SwiftUI 是一个函数式编程的东西。 Struct
s 是值类型(不是引用类型)。结构通常是不可变的。
您可以在子视图结构中简单地使用let
s。
为什么 - 当@State
更改而不是修改它时,SwiftUI 会重新创建您的视图。这是通过再次调用body
来完成的。
struct HeaderText: View
let text: String //<= here
let color: Color //<- here
var body: some View
Text(text)
.font(.custom("Gilroy-SemiBold", size: 20))
.foregroundColor(color)
为什么问题中的代码不起作用,
这是因为这些状态变量使用给定值初始化(在父视图内)以及对子视图内的@state
所做的更改(HeaderText)因为 @State
可以在视图本身内部进行更改。
【讨论】:
以上是关于为啥自定义 SwiftUI 视图不响应状态变化的主要内容,如果未能解决你的问题,请参考以下文章