@EnvironmentObject当与自定义 , 一起使用时,我遇到以下 SwiftUI 错误Shape:
Fatal error: No ObservableObject of type MyObject found. A View.environmentObject(_:) for MyObject may be missing as an ancestor of this view.: file SwiftUI, line 0
Run Code Online (Sandbox Code Playgroud)
仅当我使用Shape返回实例新副本的任何方法(例如stroke().
下面是一个可重现的 Swift Playground 示例:
import SwiftUI
import PlaygroundSupport
class MyObject: ObservableObject {
@Published var size: Int = 100
}
struct MyShape: Shape {
@EnvironmentObject var envObj: MyObject
func path(in rect: CGRect) -> Path {
let path = Path { path in
path.addRect(CGRect(x: 0, y: 0,
width: envObj.size, height: envObj.size))
}
return path
}
}
struct MyView: View {
var body: some View {
MyShape().stroke(Color.red) // FAIL: no ObservableObject found
// MyShape() // OK: it works
}
}
let view = MyView().environmentObject(MyObject())
PlaygroundPage.current.setLiveView(view)
Run Code Online (Sandbox Code Playgroud)
由于看起来环境字段没有被复制,我也尝试像这样明确地执行此操作:
struct MyView: View {
@EnvironmentObject var envObj: MyObject
var body: some View {
MyShape().stroke(Color.red).environmentObject(self.envObj)
}
}
Run Code Online (Sandbox Code Playgroud)
它仍然失败。作为一个 SwiftUI 初学者,我不知道这是否是预期的行为,不继承视图层次结构环境,以及如何处理它 - 除了不使用该环境。
任何想法?
问题实际上是在 constructor 之后.stroke调用,因此在注入之前调用(如果您注释掉中风,您可以测试它是否有效)。但不能在环境对象注入后添加,因为是修饰符。environmentObject.stroke.strokeShape-only
解决方案是在构建期间注入依赖项,如下所示。使用 Xcode 11.4 / iOS 13.4 进行测试
struct MyShape: Shape {
@ObservedObject var envObj: MyObject
...
}
struct MyView: View {
@EnvironmentObject var envObj: MyObject
var body: some View {
MyShape(envObj: self.envObj).stroke(Color.red)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |