SwiftUI中不使用@Published如何让计算属性重新求值?
解决方案
要让视图在点击按钮时重新计算Test类的计算属性value并更新,核心是手动触发ObservableObject的变更通知,让SwiftUI重新渲染视图(此时会重新读取计算属性的值)。
有两种实现方式:
方式一:直接在按钮点击时发送变更通知
修改ContentView的按钮点击逻辑,手动调用objectWillChange.send():
struct ContentView: View { @StateObject var test: Test = Test.shared var body: some View { VStack { Text(test.value) Button("update") { // 手动发送对象变更通知,触发视图刷新 test.objectWillChange.send() } } .frame(width: 300.0, height: 300.0) } } class Test: ObservableObject { static let shared: Test = Test() var value: String { return String(describing: Int.random(in: 1...1000)) } }
方式二:封装更新逻辑到Test类中
在Test类里添加一个方法专门触发变更通知,按钮点击时调用该方法,代码更具封装性:
struct ContentView: View { @StateObject var test: Test = Test.shared var body: some View { VStack { Text(test.value) Button("update") { test.triggerUpdate() } } .frame(width: 300.0, height: 300.0) } } class Test: ObservableObject { static let shared: Test = Test() var value: String { return String(describing: Int.random(in: 1...1000)) } func triggerUpdate() { // 手动发送变更通知 objectWillChange.send() } }
原理说明
ObservableObject通过objectWillChange这个Publisher通知SwiftUI视图更新。由于计算属性value不会自动触发变更通知,所以需要手动调用objectWillChange.send(),让视图重新渲染。每次视图渲染时,都会重新访问test.value,此时计算属性会重新执行getter逻辑,生成新的随机字符串。
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

