SwiftUI 发布的更新不刷新
SwiftUI Published updates not refreshing
我正在尝试通过一系列嵌套的 classes 来管理用户状态。
应用程序的基本视图使用 globalState
环境对象。此对象允许用户进出其他视图。
@EnvironmentObject var globalState: GlobalState
// View Code
Text("Logged In").opacity(globalState.user.isLoggedIn ? 1 : 0)
Text("Please Sign In").opacity(globalState.user.isLoggedIn ? 0 : 1)
然后 GlobalState
class 仅容纳 User
class。 user
字段在其他地方初始化(不,我没有引用不同的 user
对象)。
class GlobalState: ObservableObject {
@Published public var user: User // Inited somewhere else
}
class User {
@Published var isLoggedIn: Bool = false
}
User
class 在 init
ed 时自动提取有关用户的数据。在应用程序启动时,用户信息会从钥匙串(如果存在)中提取。如果可以从现有数据创建用户,则该用户的 isLoggedIn
设置为 true
。
我知道我没有重复对象,因为 GlobalState
的查看代码中 globalState.user
的内存地址与为用户更新 isLoggedIn
时相同.
使用两个级别的 @Published
变量,我感到原力受到干扰,但一切都应该顺利吗?
GlobalState
中的视图代码不会更新。有谁知道为什么?我少了一些联合柔术?
ObservedObject
仅观察一个级别的已发布属性,如果您有 ObservableObject
个实例的层次结构,则需要为每个此类情况使用自己的 ObservedObject
分隔依赖视图。
@EnvironmentObject var globalState: GlobalState
// View Code - separated explicit subview
UserLoginStateView(user: globalState.user)
和
struct UserLoginStateView: View {
@ObservedObject var user: User
var body: some View {
Group {
Text("Logged In").opacity(user.isLoggedIn ? 1 : 0)
Text("Please Sign In").opacity(user.isLoggedIn ? 0 : 1)
}
}
}
@Published
发布值更改,因此如果您要替换用户对象,它会更新。由于 User 是 class(引用类型),因此当 User.isLoggedIn 更改时,它不会更新 GlobalState.user 的值。
解决此问题的方法是 this package called NestedPublished,它将嵌套的 ObservableObject.willChange 发送到其父级。
我正在尝试通过一系列嵌套的 classes 来管理用户状态。
应用程序的基本视图使用 globalState
环境对象。此对象允许用户进出其他视图。
@EnvironmentObject var globalState: GlobalState
// View Code
Text("Logged In").opacity(globalState.user.isLoggedIn ? 1 : 0)
Text("Please Sign In").opacity(globalState.user.isLoggedIn ? 0 : 1)
然后 GlobalState
class 仅容纳 User
class。 user
字段在其他地方初始化(不,我没有引用不同的 user
对象)。
class GlobalState: ObservableObject {
@Published public var user: User // Inited somewhere else
}
class User {
@Published var isLoggedIn: Bool = false
}
User
class 在 init
ed 时自动提取有关用户的数据。在应用程序启动时,用户信息会从钥匙串(如果存在)中提取。如果可以从现有数据创建用户,则该用户的 isLoggedIn
设置为 true
。
我知道我没有重复对象,因为 GlobalState
的查看代码中 globalState.user
的内存地址与为用户更新 isLoggedIn
时相同.
使用两个级别的 @Published
变量,我感到原力受到干扰,但一切都应该顺利吗?
GlobalState
中的视图代码不会更新。有谁知道为什么?我少了一些联合柔术?
ObservedObject
仅观察一个级别的已发布属性,如果您有 ObservableObject
个实例的层次结构,则需要为每个此类情况使用自己的 ObservedObject
分隔依赖视图。
@EnvironmentObject var globalState: GlobalState
// View Code - separated explicit subview
UserLoginStateView(user: globalState.user)
和
struct UserLoginStateView: View {
@ObservedObject var user: User
var body: some View {
Group {
Text("Logged In").opacity(user.isLoggedIn ? 1 : 0)
Text("Please Sign In").opacity(user.isLoggedIn ? 0 : 1)
}
}
}
@Published
发布值更改,因此如果您要替换用户对象,它会更新。由于 User 是 class(引用类型),因此当 User.isLoggedIn 更改时,它不会更新 GlobalState.user 的值。
解决此问题的方法是 this package called NestedPublished,它将嵌套的 ObservableObject.willChange 发送到其父级。