xcode 使用环境对象时出现SwiftUI运行时问题

zphenhs4  于 2022-12-14  发布在  Swift
关注(0)|答案(1)|浏览(129)

我在以前的一个项目中遇到过这个问题,我确信当时没有运行时问题:(当前Xcode:第14.1条)
样式是全局的:

@main
struct TestingApp: App {
    var body: some Scene {
        WindowGroup { 
            TestView().environmentObject(Style()) // <- Here
        }
    }
}

每个页面都可以通过EnvironmentObject

struct TestView: View {
    @EnvironmentObject private var style: Style

    public var body: some View {
        Text("Hello World")
            .padding(style.size.inputPadding) // <- Run-time issue on this line
    }
}

Style本身声明如下:

class Style: ObservableObject {
    @Published var size = Size()
}

struct Size {
    @ScaledMetric(relativeTo: .body) var inputPadding: CGFloat = 8
}

我遇到了运行时问题:
访问视图上安装的环境之外的环境值。这将始终读取默认值,并且不会更新。

访问视图上安装的环境之外的环境值。这将始终读取默认值,并且不会更新。
有人能解释一下发生了什么吗?为什么这被认为是安装在View上的访问之外

6yt4nkrj

6yt4nkrj1#

问题的关键部分是 Package 器“安装”的位置

@ScaledMetric

在常规struct中不起作用,因为它符合DynamicProperty
https://developer.apple.com/documentation/swiftui/scaledmetric

DynamicProperty

视图在重新计算视图体之前为这些属性赋值。
https://developer.apple.com/documentation/swiftui/dynamicproperty
你的Sizestruct不是View,所以它不能得到值。在以前的版本中,你会得到一个初始值和一些更新,但这是一个bug,SwiftUI刚刚开始警告这个问题。
这就是为什么大多数SwiftUI Package 器只能在视图中工作的原因。
如果您从Sizestruct中移除 Package ,警告将消失。

相关问题