Доступ к поставщику WidgetKit IntentTimelineProvider из основного целевого приложения SwiftUI

#swiftui #widgetkit

Вопрос:

Я пытаюсь получить доступ IntentTimelineProvider WidgetExtension из основного приложения. Я делаю это для того, чтобы получить свойство даты из IntentTimelineProvider и использовать его в представлении в главном целевом приложении, как вы можете видеть из приведенного ниже кода.

Я установил целевое членство в файлах(файл в основной цели приложения и файл в цели расширения виджета) как для приложения, так и для виджета.

Расширение виджета

 
import WidgetKit
import SwiftUI
import Intents

struct Provider: IntentTimelineProvider {
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date(), configuration: ConfigurationIntent())
    }

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

//build time error here: "Reference to invalid associated type 'Entry' of type 'Provider'" here...
    func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries = [SimpleEntry]()
        let currentDate = Date()
        let midnight = Calendar.current.startOfDay(for: currentDate)
        let nextMidnight = Calendar.current.date(byAdding: .day, value: 1, to: midnight)!

        for offset in 0 ..< 60 * 24 {
           let entryDate = Calendar.current.date(byAdding: .minute, value: offset, to: midnight)!
            entries.append(SimpleEntry(date: entryDate, configuration: configuration))
        }

        let timeline = Timeline(entries: entries, policy: .after(nextMidnight))
        completion(timeline)
    }
}

struct SimpleEntry: TimelineEntry {
    let date: Date
    let configuration: ConfigurationIntent
}

struct TimeWidgetEntryView : View {
    var entry: Provider.Entry

    var body: some View {
        NotingView(entry: entry)
    }
}

@main
struct TimeWidget: Widget {
    let kind: String = "TimeWidget"

    var body: some WidgetConfiguration {
        IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
            TimeWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
    }
}

struct TimeWidget_Previews: PreviewProvider {
    static var previews: some View {
        TimeWidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent()))
            .previewContext(WidgetPreviewContext(family: .systemSmall))
    }
}
 

введите описание изображения здесь


Главное приложение

 import SwiftUI

struct SampleView: View {
    var entry : Provider.Entry
    var body: some View {
        Text(entry.date, style: .time)
    }
}
 

введите описание изображения здесь

В настоящее время я получаю ошибку времени сборки :
»
Ссылка на недопустимый связанный тип «Запись» типа «Поставщик»
»
на getTimeline() работе.

Ответ №1:

В вашем основном приложении используйте SimpleEntry вместо Provider.Entry . Последнее ссылается на соответствующий тип вашей реализации протокола, но по какой-то причине приложение не может определить тип (возможно, кто-то более подкованный, чем я, может объяснить). TimelineProvider Но вам не нужно делать из этого вывод, просто укажите фактический тип: SimpleEntry .

 struct SampleView: View {
    var entry : SimpleEntry
    var body: some View {
        Text(entry.date, style: .time)
    }
}