我不确定在我们这个勇敢的新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)")
}
}
不幸的是,直到初始化后,我才能对环境变量进行自我调用:
“无法在属性初始化程序中使用实例成员'userData';属性初始化程序在'self'可用之前运行。”
我可以看到一些可能的前进路线,但是它们都像黑客一样。我应该如何处理?
答案 0 :(得分:1)
这是方法(最简单的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)")
}
}
答案 1 :(得分:0)
这是一种简单的方法:
struct MyCoolView: View {
@EnvironmentObject var userData: UserData
var body: some View {
Observe(obj: ViewObject(id: userData.UID)) { viewObject in
Text("\(viewObject.myCoolProperty)")
}
}
}
使用此帮助程序可以使其工作:
struct Observe<T: ObservableObject, V: View>: View {
@ObservedObject var obj: T
let content: (T) -> V
var body: some View { content(obj) }
}