ios - SwiftUI - 如何将 EnvironmentObject 传递给 View 模型?

标签 ios swift mvvm swiftui

我正在寻找一个可以由 View 模型(不仅仅是 View )访问的 EnvironmentObject 。

Environment 对象跟踪应用程序 session 数据,例如登录、访问 token 等,这些数据将被传递到 View 模型(或需要的服务类)中,以允许调用 API 来传递来自此 EnvironmentObjects 的数据。

我试图将 session 对象从 View 传递给 View 模型类的初始化程序,但出现错误。

如何使用 SwiftUI 将 EnvironmentObject 访问/传递到 View 模型中?

最佳答案

下面提供的方法对我有用。使用 Xcode 11.1 开始的许多解决方案进行了测试。
问题源于 EnvironmentObject 在 View 中注入(inject)的方式,一般模式

SomeView().environmentObject(SomeEO())
即,第一次创建的 View ,第二次创建的环境对象,第三个注入(inject) View 的环境对象
因此,如果我需要在 View 构造函数中创建/设置 View 模型,环境对象还不存在。
解决方案:将所有内容分开并使用显式依赖注入(inject)
这是它在代码中的样子(通用模式)
// somewhere, say, in SceneDelegate

let someEO = SomeEO()                            // create environment object
let someVM = SomeVM(eo: someEO)                  // create view model
let someView = SomeView(vm: someVM)              // create view 
                   .environmentObject(someEO)
这里没有任何权衡,因为 ViewModel 和 EnvironmentObject 在设计上是引用类型(实际上是 ObservableObject ),所以我在这里和那里只传递引用(又名指针)。
class SomeEO: ObservableObject {
}

class BaseVM: ObservableObject {
    let eo: SomeEO
    init(eo: SomeEO) {
       self.eo = eo
    }
}

class SomeVM: BaseVM {
}

class ChildVM: BaseVM {
}

struct SomeView: View {
    @EnvironmentObject var eo: SomeEO
    @ObservedObject var vm: SomeVM

    init(vm: SomeVM) {
       self.vm = vm
    }

    var body: some View {
        // environment object will be injected automatically if declared inside ChildView
        ChildView(vm: ChildVM(eo: self.eo)) 
    }
}

struct ChildView: View {
    @EnvironmentObject var eo: SomeEO
    @ObservedObject var vm: ChildVM

    init(vm: ChildVM) {
       self.vm = vm
    }

    var body: some View {
        Text("Just demo stub")
    }
}
backup

关于ios - SwiftUI - 如何将 EnvironmentObject 传递给 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59491675/

相关文章:

ios - 如何处理场景中的备用 View

Swift 泰语本地化问题

swift 错误 : 'Sequence' requires the types 'T' and 'ArraySlice<T>' be equivalent

c# - WPF MVMVM使用行为创建对话框

android - 房间插入POJO列表并在Recyclerview中检索

ios - 当 iPhone 处于锁定状态的后台模式时,NSDATA 没有写入文档目录?

ios - 自定义文本字段自动更正

ios - 如何在展开 segue 之前添加 If 语句?

ios - 我的项目是否需要 SpriteKit 场景 (.sks) 文件?

c# - 满足 subview 模型依赖关系