在 SwiftUI 中的非视图 类 之间传递环境对象
Passing environment object between non-view classes in SwiftUI
我知道 EnvironmentObject
属性 包装器可用于将对象传递给视图。我有一个会话对象,我正在将其传递给我的 views。现在我需要将其传递到我的 model 类 之一(即非视图)。理想情况下,此模型(接收会话对象)被实例化为 StateObject
.
struct CreditDetailsView: View {
@EnvironmentObject var session: Session
@StateObject var transactionsModel = TransactionsModel(token: session.token)
上面的代码将无法工作(可以理解)因为:
cannot use instance member 'session' within property initializer; property initializers run before 'self' is available
关于如何将会话传递给 TransactionsModel
有什么建议吗?
尝试在子视图的 .onAppear()
道具中初始化 StateObject,如下所示:
struct CreditDetailsView: View {
@EnvironmentObject var session: Session
@StateObject var transactionsModel: TransactionModel?
var body: some View {
SomeChildView()
.onAppear(perform: {
transactionModel = TransactionModel(token: session.token)
})
}
}
这样,当视图呈现在屏幕上时,变量就会被初始化。将 onAppear
属性添加到哪个子视图并不重要,只要它在父视图渲染时立即渲染即可。
这是一个错误的答案。请查看上面选择的答案。
您可以访问 init
中的 session
对象。在这种情况下,transactionsModel
应该以任何方式完成初始化。
@EnvironmentObject var session: Session
@StateObject var transactionsModel = TransitionalModel(token: "")
init() {
let token = self.session.token
_transactionsModel = StateObject(wrappedValue: TransitionalModel(token: token))
}
虽然这是不可能的,但我不确定在他们之间传递一些东西是否是个好方法,这些东西看起来像是在不同层次的视图中。
我发现执行此操作的最佳方法(因为您不能有可选的 StateObject)是:
struct CreditDetailsView: View {
@EnvironmentObject var session: Session
@StateObject var localModel = LocalModel()
var body: some View {
SomeChildView()
.onAppear {
localModel.transactionModel = TransactionModel(token: session.token)
}
}
class LocalModel: ObservableObject {
@Published transactionModel: TransactionModel?
}
}
我知道 EnvironmentObject
属性 包装器可用于将对象传递给视图。我有一个会话对象,我正在将其传递给我的 views。现在我需要将其传递到我的 model 类 之一(即非视图)。理想情况下,此模型(接收会话对象)被实例化为 StateObject
.
struct CreditDetailsView: View {
@EnvironmentObject var session: Session
@StateObject var transactionsModel = TransactionsModel(token: session.token)
上面的代码将无法工作(可以理解)因为:
cannot use instance member 'session' within property initializer; property initializers run before 'self' is available
关于如何将会话传递给 TransactionsModel
有什么建议吗?
尝试在子视图的 .onAppear()
道具中初始化 StateObject,如下所示:
struct CreditDetailsView: View {
@EnvironmentObject var session: Session
@StateObject var transactionsModel: TransactionModel?
var body: some View {
SomeChildView()
.onAppear(perform: {
transactionModel = TransactionModel(token: session.token)
})
}
}
这样,当视图呈现在屏幕上时,变量就会被初始化。将 onAppear
属性添加到哪个子视图并不重要,只要它在父视图渲染时立即渲染即可。
这是一个错误的答案。请查看上面选择的答案。
您可以访问 init
中的 session
对象。在这种情况下,transactionsModel
应该以任何方式完成初始化。
@EnvironmentObject var session: Session
@StateObject var transactionsModel = TransitionalModel(token: "")
init() {
let token = self.session.token
_transactionsModel = StateObject(wrappedValue: TransitionalModel(token: token))
}
虽然这是不可能的,但我不确定在他们之间传递一些东西是否是个好方法,这些东西看起来像是在不同层次的视图中。
我发现执行此操作的最佳方法(因为您不能有可选的 StateObject)是:
struct CreditDetailsView: View {
@EnvironmentObject var session: Session
@StateObject var localModel = LocalModel()
var body: some View {
SomeChildView()
.onAppear {
localModel.transactionModel = TransactionModel(token: session.token)
}
}
class LocalModel: ObservableObject {
@Published transactionModel: TransactionModel?
}
}