IntentHandler 不适用于 widgetFamily

IntentHandler doesn't work with widgetFamily

我向我的项目添加了一个 Intent Extension Target,我试图区分在 IntentHandler 的编辑模式下显示的小部件类型,并根据此信息我想填充“编辑小部件”列表具有小型、中型或大型小部件类型。

当我使用 @Environment(\.widgetFamily) var family 时,它总是给我 .systemMedium 但我当时正在编辑一个大尺寸的小部件。

例如;当我长按一个小部件进行编辑并 select 列表中的另一个部件类型时,我看到一个列表,其中包含 IntentHandler 中的小型、中型和大型部件类型,但我想只看到小类型。

问题是是否可以根据我当前正在编辑的小部件类型来填充列表?

假设我明白你想做什么,我认为答案是否定的,这是不可能的。要复制像 Widgetsmith 这样的应用程序所做的事情,您需要定义 3 个单独的小部件,每个小部件、中等部件和大 supportedFamily 尺寸各一个。然后定义 3 个单独的 Intent,每个 widget 一个,并为每个实现一个单独的 Intent Handler。

像这样:

@main
struct MyWidgetBundle: WidgetBundle {
    @WidgetBundleBuilder
    var body: some Widget {
        SmallWidget()
        MediumWidget()
        LargeWidget()
    }
}

struct SmallWidget: Widget {
    let kind: String = "SmallWidget"
    
    var body: some WidgetConfiguration {
        IntentConfiguration(kind: kind, intent: SmallWidgetIntent.self, provider: TimelineProvider()) { entry in
            WidgetView(entry: entry)
        }
        .configurationDisplayName("Small Widget")
        .supportedFamilies([.systemSmall])
    }
}

struct MediumWidget: Widget {
    let kind: String = "MediumWidget"
    
    var body: some WidgetConfiguration {
        IntentConfiguration(kind: kind, intent: MediumWidgetIntent.self, provider: TimelineProvider()) { entry in
            WidgetView(entry: entry)
        }
        .configurationDisplayName("Medium Widget")
        .supportedFamilies([.systemMedium])
    }
}

struct LargeWidget: Widget {
    let kind: String = "LargeWidget"
    
    var body: some WidgetConfiguration {
        IntentConfiguration(kind: kind, intent: LargeWidgetIntent.self, provider: TimelineProvider()) { entry in
            WidgetView(entry: entry)
        }
        .configurationDisplayName("Large Widget")
        .supportedFamilies([.systemLarge])
    }
}

在您的意图定义文件中,定义 SmallWidgetIntentMediumWidgetIntentLargeWidgetIntent。然后在您的意图处理程序中,您将实现 SmallWidgetIntentHandlingMediumWidgetIntentHandlingLargeWidgetIntentHandling,这将 return 其关联大小的正确选项。