我正在制作一个非常简单的 WidgetKit 复杂功能,不幸的是,每次唤醒表盘时它都会闪烁。我的 Apple Watch 是最新的 WatchOS 9.4。我以前遇到过这种情况,但似乎通过卸载并重新安装手表应用程序解决了这个问题。不幸的是,事实证明这不再成功。有人有什么想法吗?这是我的代码。您可以假设
getCount()
立即返回 0 - 用它替换它不会停止闪烁。
//
// DrinkCountComplications.swift
// DrinkCountComplications
//
// Created by Bryce Sandlund on 11/6/22.
//
import WidgetKit
import SwiftUI
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), count: getCount())
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date(), count: getCount())
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
completion(Timeline(entries: [SimpleEntry(date: Date(), count: getCount())], policy: TimelineReloadPolicy.never))
}
}
struct SimpleEntry: TimelineEntry {
let date: Date
let count: Int
}
struct DrinkCountComplicationsEntryView : View {
var entry: SimpleEntry
var body: some View {
let link = URL(string: "myApp://widgetClick")?
.appending(queryItems: [URLQueryItem(name: "count", value: String(entry.count))])
ZStack {
Text("DRINK")
.offset(x: 0, y: -15)
.foregroundColor(Color.orange)
.font(.system(size: 10, weight: .semibold))
Text(String(entry.count))
.font(.title)
.offset(x: 0, y: 0)
Text("COUNT")
.offset(x: 0, y: 15)
.foregroundColor(Color.orange)
.font(.system(size: 10, weight: .semibold))
}
.unredacted()
.widgetURL(link)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background()
}
}
@main
struct DrinkCountComplications: Widget {
let kind: String = "DrinkCountComplications"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
DrinkCountComplicationsEntryView(entry: entry)
}
.configurationDisplayName("Drink Count Widget")
.description("Display drink count & add a drink")
}
}
struct DrinkCountComplications_Previews: PreviewProvider {
static var previews: some View {
DrinkCountComplicationsEntryView(entry: SimpleEntry(date: Date(), count: getCount()))
.previewContext(WidgetPreviewContext(family: .accessoryRectangular))
}
}
我遇到了这个问题,我将其追溯到给
.privacySensitive(false)
的电话。
我错误地使用它来确保我的小部件在设备锁定时继续显示。注释掉该行会阻止小部件在屏幕唤醒时闪烁/刷新。
我应该做的是在我的小部件视图上调用
.unredacted()
。如 Apple 的文档 中所述。 (虽然说实话我是通过StackOverflow找到它的!)
我终于能够在我的应用程序中隔离它,然后在示例项目中重现它。我不能保证这将是唯一可能的原因——尤其是因为它毫无意义!
对我来说,原因是在我的小部件返回的视图上使用了
.widgetURL(_)
修饰符View
:
struct RedrawWidgetsEntryView : View {
var entry: Provider.Entry
var body: some View {
Capsule()
.fill(.white)
.frame(width: .infinity, height: .infinity)
.widgetURL(URL(string: "https://apple.com")!)
}
}
我发现最快的解决方法就是将其移至背景修饰符。它仍然在视图层次结构中,所以 URL 仍然有效,但它不会触发任何强制重绘。
struct RedrawWidgetsEntryView : View {
var entry: Provider.Entry
var body: some View {
Capsule()
.fill(.white)
.frame(width: .infinity, height: .infinity)
.background(
EmptyView()
.widgetURL(URL(string: "https://apple.com")!)
)
}
}