在 SwiftUI 中的非视图类之间传递环境对象

问题描述

我知道 EnvironmentObject 属性包装器可用于将对象传递给视图。我有一个会话对象,我将它传递给我的视图。现在我需要将它传递给我的一个 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 属性添加到哪个子视图并不重要,只要它与父视图一样立即呈现即可。

,

这是一个错误的答案。请查看上面选择的答案。

您可以在 session 中访问 init 对象。在这种情况下,transactionsModel 应该以任何方式进行初始化。

@EnvironmentObject var session: Session
@StateObject var transactionsModel = TransitionalModel(token: "")

init() {
    let token = self.session.token
    _transactionsModel = StateObject(wrappedValue: TransitionalModel(token: token))
}

虽然是不可能的,但我不确定在他们之间传递一些东西的好方法,这些东西看起来像是在View的层次上处于不同的层次。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...