Swiftui - 如何使用环境对象作为参数初始化观察对象?
Swiftui - How do I initialize an observedObject using an environmentobject as a parameter?
我不确定在我们生活的这个勇敢的新 SwiftUI 世界中这是否是一种反模式,但本质上我有一个 @EnvironmentObject,其中保存了一些我的视图可以调用的基本用户信息。
我还有一个@ObservedObject,它拥有此视图所需的一些数据。
当视图出现时,我想使用那个@EnvironmentObject 来初始化@ObservedObject:
struct MyCoolView: View {
@EnvironmentObject userData: UserData
@ObservedObject var viewObject: ViewObject = ViewObject(id: self.userData.UID)
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}
不幸的是,在初始化之前我无法在环境变量上调用 self:
"Cannot use instance member 'userData' within property initializer; property initializers run before 'self' is available."
我可以看到一些可能的前进路线,但它们都感觉像是 hack。我应该如何处理这个问题?
这是方法(最简单的 IMO):
struct MyCoolView: View {
@EnvironmentObject var userData: UserData
var body: some View {
MyCoolInternalView(ViewObject(id: self.userData.UID))
}
}
struct MyCoolInternalView: View {
@EnvironmentObject var userData: UserData
@ObservedObject var viewObject: ViewObject
init(_ viewObject: ViewObject) {
self.viewObject = viewObject
}
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}
我不确定在我们生活的这个勇敢的新 SwiftUI 世界中这是否是一种反模式,但本质上我有一个 @EnvironmentObject,其中保存了一些我的视图可以调用的基本用户信息。
我还有一个@ObservedObject,它拥有此视图所需的一些数据。
当视图出现时,我想使用那个@EnvironmentObject 来初始化@ObservedObject:
struct MyCoolView: View {
@EnvironmentObject userData: UserData
@ObservedObject var viewObject: ViewObject = ViewObject(id: self.userData.UID)
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}
不幸的是,在初始化之前我无法在环境变量上调用 self:
"Cannot use instance member 'userData' within property initializer; property initializers run before 'self' is available."
我可以看到一些可能的前进路线,但它们都感觉像是 hack。我应该如何处理这个问题?
这是方法(最简单的 IMO):
struct MyCoolView: View {
@EnvironmentObject var userData: UserData
var body: some View {
MyCoolInternalView(ViewObject(id: self.userData.UID))
}
}
struct MyCoolInternalView: View {
@EnvironmentObject var userData: UserData
@ObservedObject var viewObject: ViewObject
init(_ viewObject: ViewObject) {
self.viewObject = viewObject
}
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}