不在小部件中时如何设置 .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.")
        }
    }
}

这是结果:

请记住,小部件视图不会有小部件大小,您必须自己计算。