Виджет iOS не обновляется при выборе SwiftData AppIntentIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Виджет iOS не обновляется при выборе SwiftData AppIntent

Сообщение Anonymous »

Любитель Swift... Не стесняйтесь указывать, насколько плох код.
Я пытаюсь создать приложение SwiftUI, и у меня есть модель SwiftData под названием Diem (обратный отсчет класс событий). Модель связана с DynamicAppIntent, поэтому пользователь должен иметь возможность выбрать один из обратных отсчетов в модели для отображения в виджете.
После долгих хлопот (выборка из модели SwiftData для DynamicAppIntent Виджет), мой запрос наконец-то перестал давать сбой. Однако представление виджета не обновляется с использованием выбранного AppIntent из SwiftData. Я думаю, проблема может быть в моем провайдере? Я до сих пор не до конца понимаю, как работает и обновляется таймлайн. Но это также может быть с моим WidgetConfigurationIntent/defaultQuery...
Полная версия проекта находится на GitHub. Некоторые выдержки ниже:
DiemEntityQuery.swift
struct DiemEntityQuery: EntityQuery, Sendable {
func entities(for identifiers: [DiemEntity.ID]) async throws -> [DiemEntity] {
logger.info("Loading diems for identifiers: \(identifiers)")
let container = try ModelContainer(for: Diem.self)
let modelContext = ModelContext(container)
let diems = try modelContext.fetch(FetchDescriptor(predicate: #Predicate { identifiers.contains($0.name) }))
// let diems = try modelContext.fetch(FetchDescriptor())
logger.info("Found \(diems.count) diems")
return diems.map { DiemEntity(from: $0) }
}

func suggestedEntities() async throws -> [DiemEntity] {
logger.info("Loading diems to suggest for specific diem...")
let container = try ModelContainer(for: Diem.self)
let modelContext = ModelContext(container)
let diems = try modelContext.fetch(FetchDescriptor())
logger.info("Found \(diems.count) diems")
return diems.map { DiemEntity(from: $0) }
}
}

DiemWidgetProvider.swift
private let logger = Logger(subsystem: "Widgets", category: "DiemTimelineProvider")

struct DiemWidgetProvider: AppIntentTimelineProvider {
let modelContext = ModelContext(try! ModelContainer(for: Diem.self)) // same issue as Intent

func placeholder(in context: Context) -> DiemWidgetEntry {
// let diem = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)])).first!
logger.info("Calling placeholder() in DiemWidgetProvider...")
return DiemWidgetEntry(date: .now, diem: .placeholder)
}

func snapshot(for configuration: DiemWidgetIntent, in context: Context) async -> DiemWidgetEntry {
let diems = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)]))
logger.info("Found \(diems.count) diems")
guard let diem = diems.first else {
return DiemWidgetEntry(date: .now, diem: .placeholder)
}
return DiemWidgetEntry(date: .now, diem: diem)
}

func timeline(for configuration: DiemWidgetIntent, in context: Context) async -> Timeline {
// TODO: update widget once per day

// Use the selected intent parameter to generate the timeline entry
if let diemEntity = configuration.diem {
logger.info("Found configuration diem: \(diemEntity.name)")
let diem = Diem(entity: diemEntity)
let entry = DiemWidgetEntry(date: .now, diem: diem)
let timeline = Timeline(entries: [entry], policy: .atEnd)
return timeline
} else {
// If no diem is selected, provide a placeholder or default entry
let diems = try! modelContext.fetch(FetchDescriptor(sortBy: [.init(\.date)]))
logger.info("No diem selected. Providing placeholder to widget...")
logger.info("Found \(diems.count) diems")
guard let diem = diems.first else {
logger.info("Using placeholder diem as placeholder")
return Timeline(
entries: [DiemWidgetEntry(date: .now, diem: .placeholder)],
policy: .never
)
}
logger.info("Using first diem as placeholder...")
return Timeline(entries: [DiemWidgetEntry(date: .now, diem: diem)], policy: .atEnd)
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... -appintent
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как получить элементы от Swiftdata в Appintent для виджета
    Anonymous » » в форуме IOS
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Почему интерактивные кнопки в виджете iOS 17 не вызывают AppIntent Perform() при запуске приложения?
    Anonymous » » в форуме IOS
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • SwiftData Custom Migration всегда терпит неудачу - возможна ошибка в SwiftData
    Гость » » в форуме IOS
    0 Ответы
    33 Просмотры
    Последнее сообщение Гость
  • SwiftData Custom Migration всегда терпит неудачу - возможна ошибка в SwiftData
    Anonymous » » в форуме IOS
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Сделать что-нибудь из AppIntent в виджете iOS?
    Anonymous » » в форуме IOS
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»