gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:20:08 29 4
gpt4 key购买 nike

我正在寻找一个可以由 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/62439339/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com