SwiftUI - 如何在 @ObservableObject 中获取 @EnvironmentObject 数据

dio*_*nes 9 swiftui

是否可以在 ObservableObject 中使用 @EnvironmentObject?

它给了我一个错误:

Fatal error: No ObservableObject of type EntryViewModel found. A View.environmentObject(_:) for EntryViewModel may be missing as an ancestor of this view.: file SwiftUI, line 0
Run Code Online (Sandbox Code Playgroud)

我知道 @EnvironmentObject 很好,因为我在其他地方使用它。

如果没有,我怎样才能得到这些信息?

class ResultsViewModel: ObservableObject {
    @EnvironmentObject var entry: EntryViewModel
    ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

paw*_*222 7

是否可以在 ObservableObject 中使用 @EnvironmentObject?

不它不是。@EnvironmentObject只能在View中使用。

如果没有,我怎样才能得到这些信息?

一个可能的解决方案是将其传入init

class ResultsViewModel: ObservableObject {
    var entry: EntryViewModel

    init(entry: EntryViewModel) {
        self.entry = entry
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案可能是使用单例或(也许是最好的)依赖注入

  • 有趣的是,您可以在 ObservableObject 中使用环境。尽管文档将环境描述为“从视图环境中读取值的属性包装器”。 (2认同)

mal*_*hal 5

您需要使用DynamicProperty它的update功能,例如

class MyObject: ObservableObject {
    var context: NSManagedObjectContext? 
}

struct MyProperty: DynamicProperty {
    @Environment(\.managedObjectContext) private var viewContext
    @StateObject var object = MyObject()

    // update is called before body in the View containing this property
    func update() {
        // environment vars now are valid

        if object.context != viewContext {
            // do something
            object.context = viewContext
        }
    }
}

struct MyView {
    var myProperty = MyProperty()

    var body: some View {
    }
}
Run Code Online (Sandbox Code Playgroud)