【问题标题】:SwiftUI run-time issue when using an environment object使用环境对象时的 SwiftUI 运行时问题
【发布时间】:2022-12-18 01:26:27
【问题描述】:

我在我的一个旧项目中遇到过这个问题,我确信当时没有运行时问题:(当前 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
}

我遇到了这个运行时问题:

在安装到视图之外访问环境 <CGFloat> 的值。这将始终读取默认值并且不会更新。

在视图上安装之外访问环境 <DynamicTypeSize> 的值。这将始终读取默认值并且不会更新。

有人可以解释发生了什么以及为什么这被认为是访问中价值外部安装在 View 上?

【问题讨论】:

    标签: xcode swiftui runtime-error


    【解决方案1】:
    @ScaledMetric
    

    不适用于常规结构,因为它符合 DynamicProperty

    https://developer.apple.com/documentation/swiftui/scaledmetric

    DynamicProperty
    

    视图在重新计算视图主体之前为这些属性赋值。

    https://developer.apple.com/documentation/swiftui/dynamicproperty

    您的 Size 结构不是视图,因此无法获取值。在以前的版本中,你会得到一个初始值和一些更新,但这是一个错误,SwiftUI 刚刚开始警告这个问题。

    这就是为什么大多数 SwiftUI 包装器只在视图中工作。

    如果您从 Size 结构中删除包装器,警告将消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 2014-10-20
      • 1970-01-01
      • 2014-09-20
      • 2019-10-23
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多