top of page

Widgets Unleashed: Using WidgetKit with SwiftUI

Are you tired of the same old humdrum widgets on your iPhone? Looking for a way to create something fresh, exciting, and engaging for your app’s users? Look no further! In this article, we’ll explore how to use WidgetKit in tandem with SwiftUI to create some seriously cool widgets that will make your users’ home screens pop.

Just like SwiftUI, we promise to keep things lightweight and fun. So, let’s jump into the world of widgets!

What is WidgetKit?

WidgetKit is a framework introduced by Apple in 2020 that allows developers to create highly customizable widgets for iOS, iPadOS, and macOS. WidgetKit works hand-in-hand with SwiftUI, Apple’s UI toolkit, making the creation of gorgeous widgets as smooth as butter on a hot pancake. Oh, and did we mention that it’s incredibly easy to use? If that doesn’t grab your attention, we don’t know what will!

Getting Started

Before diving headfirst into widget creation, make sure you have Xcode 12 or later installed on your machine. If you don’t, your widgets will be sadder than a puppy left out in the rain. Ready? Great! Let’s go!

1. Create a new Widget Extension

Open your existing SwiftUI project or create a new one. In the Xcode menu, navigate to File > New > Target. Scroll down and select Widget Extension, then click Next. Give your widget a name (e.g., “MyAwesomeWidget”) and click Finish. Voila! You’ve just added a widget extension to your app. Easy as pie, right?

2. Understand the WidgetKit template

Xcode will generate a template for your new widget, complete with a timeline provider, a placeholder view, and an entry view. If this sounds more confusing than the plot of the movie “Inception,” fear not! We’ll break it down for you:


The TimelineProvider is the wizard behind the curtain, managing the data and timeline for your widget. It has two main functions:

  • snapshot(with:completion:): Generates a snapshot of the widget's state for quick previews or when the system needs a placeholder.

  • timeline(with:completion:): Provides an array of timeline entries to display in the widget.

Placeholder View

This is the view displayed when your widget is loading or the system needs a snapshot. It’s like a stand-in actor, just waiting for its big break.

Entry View

This is the main view of your widget, where you’ll design the actual content. It’s the superstar, the leading role, the pièce de résistance!

3. Customize your widget

Now that you understand the basic structure, let’s make your widget shine!

Design the Entry View

Open the MyAwesomeWidgetEntryView.swift file, and you'll find a simple Text view displaying the date. But we want something more exciting, don’t we? Let’s replace that code with something more thrilling:

struct MyAwesomeWidgetEntryView: View {
    var entry: Provider.Entry

    var body: some View {
        VStack {
            Text("Welcome to My Awesome Widget!")
            Text("Aren't widgets just the coolest?")

Now, your widget has a snazzy new look!

Configure the TimelineProvider

In MyAwesomeWidget.swift, update your timeline provider to match your design. For example:

struct Provider: TimelineProvider {
    func placeholder(in context: Context) ->SimpleEntry(date: Date())

    func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        let entry = SimpleEntry(date: Date())

    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        let currentDate = Date()
        let refreshDate = .minute, value: 15, to: currentDate)!
        let entry = SimpleEntry(date: currentDate)

        let timeline = Timeline(entries: [entry], policy: .after(refreshDate))

Here, we’ve configured the timeline provider to refresh every 15 minutes, with a simple entry displaying the current date.

4. Configure your widget’s metadata

In MyAwesomeWidget.swift, you'll find a main attribute with a Widget structure. This is where you can configure your widget's metadata, such as its name, description, and supported families:

struct MyAwesomeWidget: Widget {
    let kind: String = "MyAwesomeWidget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            MyAwesomeWidgetEntryView(entry: entry)
        .configurationDisplayName("My Awesome Widget")
        .description("This widget displays a fun, personalized greeting.")
        .supportedFamilies([.systemSmall, .systemMedium, .systemLarge])

Now your widget will support all three sizes: small, medium, and large.

5. Preview your widget

To make sure your widget looks as amazing as you think it does, open MyAwesomeWidget.swift and update the MyAwesomeWidget_Previews code to preview your widget:

struct MyAwesomeWidget_Previews: PreviewProvider {
    static var previews: some View {
        MyAwesomeWidgetEntryView(entry: SimpleEntry(date: Date()))
            .previewContext(WidgetPreviewContext(family: .systemSmall))

Hit Resume in the preview pane, and bask in the glory of your magnificent widget creation!


You’ve done it! You’ve created a beautiful, engaging widget using WidgetKit and SwiftUI. Give yourself a pat on the back or maybe even a high-five (just don’t leave yourself hanging). Now, go forth and unleash your creativity upon the world of widgets!

Give Support or Tip👋🏿

4 views0 comments


bottom of page