WidgetBundle 根据某些逻辑返回小部件

sab*_*ius 9 widget widgetkit swiftui ios14

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

@main
struct WidgetsBudle: WidgetBundle {
    @WidgetBundleBuilder
    var body: some Widget {
        Widget1()
        Widget2()
        Widget3()
    }
}
Run Code Online (Sandbox Code Playgroud)

Widget2依赖于位置服务才能正常工作,但是如果用户没有授予位置权限,那么即使显示这个小部件也没有任何意义。我可以有一些逻辑涉及返回WidgetBundlebody 内的小部件吗?

小智 7

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

@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()
    }
}
Run Code Online (Sandbox Code Playgroud)