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