我在以前的一个项目中遇到过这个问题,我确信当时没有运行时问题:(当前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
上的访问值之外?
1条答案
按热度按时间6yt4nkrj1#
问题的关键部分是 Package 器“安装”的位置
在常规
struct
中不起作用,因为它符合DynamicProperty
https://developer.apple.com/documentation/swiftui/scaledmetric
视图在重新计算视图体之前为这些属性赋值。
https://developer.apple.com/documentation/swiftui/dynamicproperty
你的
Size
struct
不是View
,所以它不能得到值。在以前的版本中,你会得到一个初始值和一些更新,但这是一个bug,SwiftUI刚刚开始警告这个问题。这就是为什么大多数SwiftUI Package 器只能在视图中工作的原因。
如果您从
Size
struct
中移除 Package ,警告将消失。