在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))
}