使用 colorScheme 环境值在模型类中使用

问题描述 投票:0回答:1

我正在尝试在视图中获取“使用 colorScheme”环境值,并根据 colorScheme,为颜色使用不同的主题模型

@Environment(\.colorScheme) private var colorScheme
self.themeModel.setTheme(colorScheme == .light ? LightTheme() : DarkTheme())

但我收到警告 访问安装在视图之外的环境的值。这将始终读取默认值并且不会更新。 并且总是看到 colorScheme = .light

我该怎么做?

swiftui
1个回答
0
投票

@Environment 属性只能在

View
ViewModifier
和确认
DynamicProperty
声明的属性包装器内声明。

根据我的经验,即使尝试读取

View.body
内的环境属性也没有完全按预期工作。

您有两个选择:

最简单的:

  • 如果您正在处理
    UITraitCollection.current
    视图,请使用
    UIKit
    获取当前配色方案;或

更“SwiftUI-y”:

  • 创建一个单独的类,使其符合
    ObservableObject
    ,并添加您的
    ColorScheme
    属性,并用
    @Published
    注释:
final class MyObject: ObservableObject {
  @Published var colorScheme: ColorScheme
}

在您看来,将环境值“出现”分配给您的对象,以便可以在

SwiftUI.View
之外使用它:

struct MyView: View {
  @Environment(\.colorScheme) var colorScheme
  @ObservedObject var myObject: MyObject // must be passed via init

  var body: some View {
    myViewBody
      .onAppear { 
        myObject.colorScheme = colorScheme
      }
  } 
}

事实上,如果您不打算在视图中使用

ObservableObject
,您甚至可能不需要
@Published
/
@ObservedObject
/
MyObject

© www.soinside.com 2019 - 2024. All rights reserved.