Как поддерживать несколько виджетов при использовании WidgetKit?

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

3 января 2023 г. | Разработка | Ли Ках Сенг

Наличие нескольких виджетов с различными функциональными возможностями - довольно распространенная особенность для приложений в наши дни. Например, в приложении для покупок может быть виджет, показывающий сегодняшнюю акцию, и другой виджет, показывающий статус заказа пользователя.

Apple предоставила нам 2 способа включить поддержку нескольких виджетов в наших приложениях:

  • Использование бандл виджетов

  • Наличие нескольких расширений виджета

В этой статье мы рассмотрим оба этих метода по отдельности, так что давайте начнем.

ПримечаниеЕсли вы не знакомы с тем, как создать виджет с помощью WidgetKit, я настоятельно рекомендую вам сначала прочитать мою статью «Начало работы с WidgetKit», прежде чем продолжить.

# 1: Использование Бандл Виджетов

Допустим, мы реализовали виджет с именем MyWidget1.

@main
struct MyWidget1: Widget {

    var body: some WidgetConfiguration {
        // Widget configuration here...
        // ...
        // ...
    }
}

Поскольку MyWidget1 был снабжен атрибутом @main, система примет его за точку входа расширения виджета и отобразит снимок виджета в галерее виджетов.

Теперь предположим, что мы создали другой виджет с именем MyWidget2 в том же расширении виджета. Если мы попытаемся отметить MyWidget2 атрибутом @main, мы получим сообщение об ошибке компиляции:

атрибут 'main' может применяться только к одному типу в модуле.

По существу, эта ошибка означает, что у нас не может быть 2 точек входа в одном и том же расширении виджета. Итак, что мы должны сделать, чтобы MyWidget1 и MyWidget2 могли появиться в галерее виджетов? Здесь на помощь приходит Widget Bundle.

Вот как использовать бандл виджетов:

@main
struct MyWidgetBundle: WidgetBundle {
    
    @WidgetBundleBuilder
    var body: some Widget {
        MyWidget1()
        MyWidget2()
    }
}

Как видите, способ использования бандла виджетов довольно прост. Все, что нам нужно сделать, это аннотировать его атрибутом @main и сделать MyWidget1 и MyWidget2 частью его тела. Не забудьте также удалить аннотацию @main в MyWidget1.

Обратите внимание, что в галерее виджетов будут отображаться виджеты в соответствии с порядком расположения виджетов в теле бандла виджетов.

Выходя за Пределы Бандла Виджетов

Теперь, когда мы узнали, как использовать бандл виджетов, значит ли это, что с этого момента мы можем добавлять столько виджетов в тело бандла, сколько захотим? К сожалению, это не так.

Если мы попытаемся добавить более 10 виджетов в тело бандла виджетов, мы получим ошибку компиляции «Extra argument in call» (Избыточный аргумент в вызове).

@main
struct MyWidgetBundle: WidgetBundle {
    
    @WidgetBundleBuilder
    var body: some Widget {
        MyWidget1()
        MyWidget2()
        MyWidget3()
        MyWidget4()
        MyWidget5()
        MyWidget6()
        MyWidget7()
        MyWidget8()
        MyWidget9()
        MyWidget10()
        MyWidget11() // 						
Источник: https://habr.com/ru/post/710918/


Интересные статьи

Интересные статьи

Приятно познакомиться, мы битриксоиды. Да-да, те самые которые:- вообще не модные,- пишут НЕ на Laravel и Symphony,- возятся с кучей мягко говоря “неидеального” кода под названием “1С-Битрикс: Управле...
Однажды, в понедельник, мне пришла в голову мысль — "а покопаюсь ка я в новом ядре" (новым относительно, но об этом позже). Мысль не появилась на ровном месте, а предпосылками для нее стали: ...
Один из способов использовать CSS переменные уже сегодня Создадим сайт который динамически поддерживает светлую, тёмную и цветовые темы. Интерактивное демо Создаём базовый цвет который буд...
Во многих инструкциях с просторов интернета описывают некий минимум действий, и как следствие минимум команд и возможностей. Я решил сделать некую подборку мало освещенных возможностей, особенно...
В первой части мы превратили наш сайт в Progressive Web App. Там же было сказано, что совсем недавно, 6 февраля 2019 года, Google предоставили простую возможность выкладывать PWA в Google Pla...