WatchOS 并发症闪烁

问题描述 投票:0回答:2

我正在制作一个非常简单的 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))
    }
}

ios apple-watch watchos widgetkit
2个回答
0
投票

我遇到了这个问题,我将其追溯到给

.privacySensitive(false)
的电话。

我错误地使用它来确保我的小部件在设备锁定时继续显示。注释掉该行会阻止小部件在屏幕唤醒时闪烁/刷新。

我应该做的是在我的小部件视图上调用

.unredacted()
。如 Apple 的文档 中所述。 (虽然说实话我是通过StackOverflow找到它的!)


0
投票

我终于能够在我的应用程序中隔离它,然后在示例项目中重现它。我不能保证这将是唯一可能的原因——尤其是因为它毫无意义!

对我来说,原因是在我的小部件返回的视图上使用了

.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")!)
            )
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.