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])
}
}
在您的意图定义文件中,定义 SmallWidgetIntent
、MediumWidgetIntent
和 LargeWidgetIntent
。然后在您的意图处理程序中,您将实现 SmallWidgetIntentHandling
、MediumWidgetIntentHandling
和 LargeWidgetIntentHandling
,这将 return 其关联大小的正确选项。
我向我的项目添加了一个 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])
}
}
在您的意图定义文件中,定义 SmallWidgetIntent
、MediumWidgetIntent
和 LargeWidgetIntent
。然后在您的意图处理程序中,您将实现 SmallWidgetIntentHandling
、MediumWidgetIntentHandling
和 LargeWidgetIntentHandling
,这将 return 其关联大小的正确选项。