Я работаю над виджетом SwiftUI, используя WidgetKit, и столкнулся с проблемой, из-за которой содержимое виджета некорректно отображается на главном экране. Содержимое виджета отображается в виде цветных прямоугольников вместо ожидаемого текста и элементов. Однако предварительный просмотр в SwiftUI Canvas работает отлично.
Вот мой код виджета:
импортировать WidgetKit импортировать SwiftUI импорт намерений //МАРК: - Создание провайдера для предоставления данных для виджета Поставщик структуры: TimelineProvider { typealias Entry = WidgetEntry ///Заполнитель для отображения статических данных пользователю заполнитель func (в контексте: Context) -> WidgetEntry { WidgetEntry(дата: Дата(), topThreeMovies: [dummyMovie, dummyMovie, dummyMovie]) } ///Снимок для использования предварительного просмотра при добавлении виджетов func getSnapshot(в контексте: Контекст, завершение: @escaping (WidgetEntry) -> ()) { /// Виджет исходного снимка или типа загрузки пусть запись = WidgetEntry(дата: Дата(), topThreeMovies: [dummyMovie, dummyMovie, dummyMovie]) завершение (запись) } /// Эта функция обновляет виджет для событий func getTimeline(в контексте: Контекст, завершение: @escaping (Timeline) -> ()) { пусть MovieListViewModel = MovieListViewModel() // Получение трех лучших фильмов с использованием модели представления MovieListViewModel.fetchTopThreeMovies { topThreeMovies в /// Инициализация пустого массива для записей WidgetEntry записи var: [WidgetEntry] = [] ///Установим значение для currentDate пусть текущаяДата = Дата() /// Указываем данные для входа пусть запись = WidgetEntry(дата: Дата(), topThreeMovies:topThreeMovies ) /// Обновляем виджет каждые 15 минут пусть обновитьВремя = Calendar.current.date(byAdding: .минута, значение: 1, to: currentDate) записи.append(запись) /// Создание временной шкалы let timeline = Timeline(записи: записи, политика: .after(refreshTime!)) завершение (сроки) } } } // ОТМЕТКА: - Просмотр записи виджета «Лучшие фильмы» структура TopMoviesWidgetEntryView: Просмотр { запись переменной: Provider.Entry /// Доступ к переменной среды семейства виджетов @Environment(\.widgetFamily) семейство переменных @ViewBuilder var body: some View { /// Переключение на основе семейства виджетов переключить семейство { случай .systemMedium: /// Отображение MovieWidgetView для виджета среднего размера MovieWidgetView(topThreeMovies: [dummyMovie, dummyMovie, dummyMovie]) по умолчанию: /// Обработка других типов семейства виджетов (здесь для простоты используется fatalError) FatalError("Неподдерживаемое семейство виджетов") } } } // ОТМЕТКА: - Конфигурация виджета структура TopMoviesWidget: Виджет { /// Уникальный идентификатор виджета let kind: String = "TopMoviesWidget" var body: some WidgetConfiguration { StaticConfiguration(вид: вид, поставщик: Provider()) {запись в TopMoviesWidgetEntryView (запись: запись) } .configurationDisplayName("Виджет лучших фильмов") .description("Это виджет списка лучших фильмов сегодняшнего дня.") .supportedFamilies([.systemMedium]) } } // ОТМЕТКА: - Создать предварительный просмотр для представления записи виджета. структура TopMoviesWidget_Previews: PreviewProvider { статические предварительные просмотры var: some View { TopMoviesWidgetEntryView(запись: WidgetEntry(дата: Дата(), topThreeMovies: [dummyMovie, dummyMovie, dummyMovie])) .previewContext(WidgetPreviewContext(семейство: .systemMedium)) } } Вот мой код для виджета:
импортировать SwiftUI импортировать WidgetKit /// Виджет лучших фильмов структура MovieWidgetView: Посмотреть { // @StateObject var viewModel = MovieListViewModel() var topThreeMovies: [Фильм] var body: some View { HStack(выравнивание: .top) { /// Показать день недели, дату и кнопку списка VStack(выравнивание: .leading) { ///День недели Text("\(Date().getFormattedWeekDay())") .foregroundColor(.оранжевый) .смелый() ///Дата Текст("\(Дата().getFormattedDate())") .смелый() Разделитель() ///Кнопка списка для перехода к экрану списка фильмов Кнопка (действие: { /// Закрываем вид виджета и переходим к MovieListView }) { Label("", systemImage: "list.bullet.circle.fill").body .foregroundColor(.оранжевый) .font(.system(размер: 30)) } } .padding(EdgeInsets(верхнее: 20, ведущее: 0, нижнее: 0, завершающее: 10)) Разделитель() ///Три лучших фильма Listr VStack(выравнивание: .leading) { ForEach(0.. Void) { isLoading = правда ///получим три лучших фильма из всех фильмов для меня в 0.. Int? { return Movies.firstIndex { $0.id == movie.id } } Снимок виджета с фиктивными данными:

Виджет на главном экране:
