WidgetBundle返回基于某些逻辑的小部件



我为我的应用程序准备了几个iOS14主屏幕小工具,并将它们全部返回到WidgetBundle中,如下所示:

@main
struct WidgetsBudle: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
Widget1()
Widget2()
Widget3()
}
}

Widget2依赖于定位服务才能正常工作,但如果用户没有授予定位权限,那么显示这个小部件就没有意义了。我可以在返回WidgetBundle主体内的小部件时使用一些逻辑吗?

如果您想根据某些逻辑选择小部件捆绑包,可以执行以下操作:

@main
struct WidgetLauncher {
static func main() {
if isLocationEnabled {
WidgetBundle1.main()
} else {
WidgetBundle2.main()
}
}

static var isLocationEnabled: Bool {
/// Put your logic here
true
}
}
struct WidgetBundle1: WidgetBundle {
var body: some Widget {
Widget1()
Widget2()
Widget3()
}
}
struct WidgetBundle2: WidgetBundle {
var body: some Widget {
Widget1()
Widget2()
}
}

您还可以通过向supportedFamilies传递一个空列表来控制小部件配置本身的可用性。然后,您可以无条件地将这些小部件包含在WidgetBundleBuilder中,但只有那些返回有效配置并具有非空的受支持族列表的小部件才会实际显示。类似这样的东西:

struct ExampleWidget: Widget {
var isAvailable: Bool = true
var body: some WidgetConfiguration {
return StaticConfiguration(kind: "something", provider: SomeProvider()) { _ in
return SomeView()
}
.configurationDisplayName("Some name")
.description("Some description")
.supportedFamilies(supportedFamilies)
} 
var supportedFamilies: [WidgetFamily] {
isAvailable ? [.systemMedium] : []
}
}

然后在小部件捆绑包中,你可以做这样的事情:

@main
struct WidgetsBundle: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
ExampleWidget(isAvailable: /* whatever condition you like */)
}
}

相关内容

  • 没有找到相关文章

最新更新