WidgetBundle return widgets based on some logic

Viewed 959

I have several iOS14 Home screen Widgets ready for my app and return them all in WidgetBundle like this:

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

Widget2 depends on location services to work properly, but if the user hasn't granted location permissions, it doesn't really make sense to even show this widget. Can I have some logic involved in returning the widgets inside WidgetBundle body ?

1 Answers

If you want to select a widget bundle based on some logic you can do the following:

@main
struct WidgetLauncher {
    static func main() {
        if isLocationEnabled {
            WidgetBundle1.main()
        } else {
            WidgetBundle2.main()
        }
    }
    
    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()
    }
}
Related