不在小部件中时如何设置 .widgetFamily @Environment 变量?

时间:2021-07-20 14:28:12

标签: swiftui widgetkit

我想在我的主应用中预览我的 WidgetKit 小部件。

小部件的 .systemSmall.systemMedium 尺寸布局不同。

当我在主应用程序中设置 .environment(\.widgetFamily, .systemSmall) 时,出现构建错误:

Key path value type 'WritableKeyPath<EnvironmentValues, WidgetFamily>' cannot be converted to contextual type 'KeyPath<EnvironmentValues, WidgetFamily>'

如果我不设置值,则默认为 .systemMedium

有没有办法使用.systemSmall

1 个答案:

答案 0 :(得分:0)

出于显而易见的原因,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.")
        }
    }
}

这是结果:

Widget view loaded in app using correct family

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