不在小部件中时如何设置 .widgetFamily @Environment 变量?
How to set .widgetFamily @Environment variable when NOT in a widget?
我想在我的主应用程序中预览我的 WidgetKit 小部件。
.systemSmall
和 .systemMedium
大小的小部件布局不同。
当我在主应用程序中设置 .environment(\.widgetFamily, .systemSmall)
时出现构建错误:
Key path value type 'WritableKeyPath<EnvironmentValues, WidgetFamily>' cannot be converted to contextual type 'KeyPath<EnvironmentValues, WidgetFamily>'
如果我不设置值,默认为.systemMedium
。
有没有办法使用.systemSmall
?
由于显而易见的原因,widgetFamily
环境键未在应用程序中设置,但您可以自己实现。
首先你需要像这样让WidgetFamily
符合EnvironmentKey
:
extension WidgetFamily: EnvironmentKey {
public static var defaultValue: WidgetFamily = .systemMedium
}
然后您需要添加您的自定义环境密钥,如下所示:
extension EnvironmentValues {
var widgetFamily: WidgetFamily {
get { self[WidgetFamily.self] }
set { self[WidgetFamily.self] = newValue }
}
}
现在您可以在应用中使用 .environment()
修饰符:
struct ContentView: View {
var body: some View {
InterestingWidgetEntryView(entry: .init(date: .init()))
.environment(\.widgetFamily, .systemSmall)
}
}
这就是我创建小部件视图的方式:
struct InterestingWidgetEntryView : View {
@Environment(\.widgetFamily) var family
var entry: Provider.Entry
var body: some View {
switch family {
case .systemSmall:
Text("Small")
case .systemMedium:
Text("Medium")
case .systemLarge:
Text("Large")
default:
Text("Some other WidgetFamily in the future.")
}
}
}
这是结果:
请记住,小部件视图不会有小部件大小,您必须自己计算。
我想在我的主应用程序中预览我的 WidgetKit 小部件。
.systemSmall
和 .systemMedium
大小的小部件布局不同。
当我在主应用程序中设置 .environment(\.widgetFamily, .systemSmall)
时出现构建错误:
Key path value type 'WritableKeyPath<EnvironmentValues, WidgetFamily>' cannot be converted to contextual type 'KeyPath<EnvironmentValues, WidgetFamily>'
如果我不设置值,默认为.systemMedium
。
有没有办法使用.systemSmall
?
由于显而易见的原因,widgetFamily
环境键未在应用程序中设置,但您可以自己实现。
首先你需要像这样让WidgetFamily
符合EnvironmentKey
:
extension WidgetFamily: EnvironmentKey {
public static var defaultValue: WidgetFamily = .systemMedium
}
然后您需要添加您的自定义环境密钥,如下所示:
extension EnvironmentValues {
var widgetFamily: WidgetFamily {
get { self[WidgetFamily.self] }
set { self[WidgetFamily.self] = newValue }
}
}
现在您可以在应用中使用 .environment()
修饰符:
struct ContentView: View {
var body: some View {
InterestingWidgetEntryView(entry: .init(date: .init()))
.environment(\.widgetFamily, .systemSmall)
}
}
这就是我创建小部件视图的方式:
struct InterestingWidgetEntryView : View {
@Environment(\.widgetFamily) var family
var entry: Provider.Entry
var body: some View {
switch family {
case .systemSmall:
Text("Small")
case .systemMedium:
Text("Medium")
case .systemLarge:
Text("Large")
default:
Text("Some other WidgetFamily in the future.")
}
}
}
这是结果:
请记住,小部件视图不会有小部件大小,您必须自己计算。