在SwiftUI中的非视图类之间传递环境对象
我知道在SwiftUI中的非视图类之间传递环境对象,swift,swiftui,environmentobject,Swift,Swiftui,Environmentobject,我知道EnvironmentObject属性包装器可用于将对象传递给视图。我有一个会话对象,我正在将它传递给我的视图。现在我需要将其传递到我的一个模型类(即非视图)中。理想情况下,此模型(接收会话对象)被实例化为StateObject struct CreditDetailsView: View { @EnvironmentObject var session: Session @StateObject var transactionsModel = TransactionsModel(
EnvironmentObject
属性包装器可用于将对象传递给视图。我有一个会话对象,我正在将它传递给我的视图。现在我需要将其传递到我的一个模型类(即非视图)中。理想情况下,此模型(接收会话对象)被实例化为StateObject
struct CreditDetailsView: View {
@EnvironmentObject var session: Session
@StateObject var transactionsModel = TransactionsModel(token: session.token)
上述代码不起作用(可以理解),因为:
关于如何将会话传递到
TransactionModel
中的任何建议?请尝试在.onAppear()
prop中将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
对象。在这种情况下,TransactionModel
应该以任何方式进行初始化
@EnvironmentObject var session: Session
@StateObject var transactionsModel = TransitionalModel(token: "")
init() {
let token = self.session.token
_transactionsModel = StateObject(wrappedValue: TransitionalModel(token: token))
}
虽然这是不可能的,但我不确定这是否是在他们之间传递信息的好方法,因为他们看起来在不同的视角层次。谢谢!在另一种情况下,我能够在按钮按下的onAction部分传递令牌。所以我猜你上面提到的方法和按下按钮是两个让它工作的例子。没问题,希望它能帮助你:)我还没有在视图上看到任何提供init的代码。但是想想看,没有什么能阻止你这么做。谢谢你指出这一点。我可以在模型上调用一个方法并通过init提供令牌。关于在
init
中提供一些东西。据我所知,这是常见的模式。当您需要将某个值传递给视图并将其用作特定@State/@StateObject的初始值时,通常会这样使用。这种情况通常使用指定的init来接收来自外部的值。在视图
的init
方法中,环境不可用。这将给你一个致命的错误,即找不到该类型的ObservieObject。没有测试它。对不起,回答不正确。我会在答案的顶部加上评论。
@EnvironmentObject var session: Session
@StateObject var transactionsModel = TransitionalModel(token: "")
init() {
let token = self.session.token
_transactionsModel = StateObject(wrappedValue: TransitionalModel(token: token))
}