WidgetKit @StateObject 不更新视图

2024-04-01

我无法理解如何让我的SwiftUI数据模型示例与我的小部件一起使用。它在我的测试应用程序中运行得很好,我立即观察到变化。当我尝试使用小部件时,我可以看到控制台中打印的数据,但我的中没有发生任何变化View in WidgetKit。我正在使用一个ObservableObject类和@Published变量。我尝试过使用@StateObject, @ObservedObject and an @EnvironmentObject和相同的结果。总是导致今天没有比赛。我的数据模型是Combine相关,不确定这是否与我看不到数据更改的原因有关WidgetKit's View.

SwiftUI 应用程序示例工作

struct ContentView: View {
    @ObservedObject var data = CombineData()
    @State private var showSortSheet: Bool = false
    @State private var nhlTeams: TeamOrder = .NewYorkIslanders
    
    var body: some View {
        NavigationView {
            VStack(alignment: .leading) {
                if data.schedule?.dates.first != nil {
                    Text("Game today")
                } else {
                    Text("No game today")
                }
            }
            .listStyle(PlainListStyle())
            .navigationBarTitle(Text(""), displayMode: .inline)
            .navigationBarItems(leading: HStack {
                Button(action: {
                    self.showSortSheet.toggle()
                }) {
                    HStack {
                        Image(systemName: "arrow.up.arrow.down")
                    }
                }
            })
            .actionSheet(isPresented: $showSortSheet) {
                ActionSheet(title: Text("Teams:"), buttons: [TeamOrder.NewYorkIslanders, TeamOrder.MontrealCanadiens].map { method in
                    ActionSheet.Button.default(Text("\(method.rawValue)")) {
                        self.nhlTeams = method
                        data.fetchSchedule(self.nhlTeams.rawValue)
                        print("\(self.nhlTeams.rawValue)")
                    }
                })
            }
            .onAppear {
                data.fetchSchedule(self.nhlTeams.rawValue)
            }
        }
    }
}

示例小部件@StateObject(无数据变化)

struct ExampleEntryView : View {
    var entry: Provider.Entry
    @Environment(\.widgetFamily) var widgetFamily
    @StateObject var model = CombineData()
    @ObservedObject var model = CombineData()
    /*@EnvironmentObject private var model: CombineData*/
    var body: some View {
        VStack(alignment: .leading) {
            if model.schedule?.dates.first != nil {
                Text("Game today")
            } else {
                Text("No game today")
            }
        }
        .onAppear {
            model.fetchSchedule(entry.configuration.teams.rawValue) {
                WidgetCenter.shared.reloadTimelines(ofKind: "NHL_Widget")
            }
        }
    }
}

示例小部件 2 TimelineEntry(无数据更改)

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

struct Provider: IntentTimelineProvider {
    
    func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries: [SimpleEntry] = []
        let currentDate = Date()
        let model = CombineData()
        let entryDate = Calendar.current.date(byAdding: .minute, value: 1, to: currentDate)!
        let entry = SimpleEntry(date: entryDate, configuration: configuration, model: model)
        entries.append(entry)
        let timeline = Timeline(entries: entries, policy: .atEnd)
        model.fetchSchedule(entry.configuration.teams.rawValue) {
            completion(timeline)
        }
    }
}

struct ExampleEntryView : View {
    var entry: Provider.Entry
    @Environment(\.widgetFamily) var widgetFamily
    var body: some View {
        VStack(alignment: .leading) {
            if entry.model.schedule?.dates.first != nil {
                Text("Game today")
            } else {
                Text("No game today")
            }
        }
    }
}

小部件是静态的,您提供的视图getTimeline是按原样显示并且不会更新的内容,因此调用fetchSchedule on onAppear甚至不会被处决。一旦你执行完成处理程序getTimeline,不再执行任何代码。

要在小部件上显示数据,您需要在中获取数据getTimeline,创建一个从头开始显示数据的视图,并在完成处理程序中返回该条目。

在你的最后一个例子中,我建议你在完成处理程序中创建你的条目model.fetchSchedule并通过schedule反对你的观点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WidgetKit @StateObject 不更新视图 的相关文章

随机推荐

  • MongoDB:更新子数组的属性仅更新第一个元素

    匹配元素如下所示 id oid 519ebd1cef1fce06f90e3157 from Tester2 to Tester messages username Tester2 message heeey read false usern
  • 计算异或的算法

    我想计算 0 到 n 1 2 1 之间的数字与 0 到 n 1 2 1 之间的每个数字的异或 我想在 O n 时间内完成此操作 并且不能使用 XOR OR AND 运算 如果我知道X和Y的XOR 我可以在常数时间内计算X 1和Y的XOR吗
  • 从 ARC 静态库访问 @property 时,ARC 应用程序崩溃

    我有一个 ARC 自动引用计数 questions tagged automatic reference counting 构建静态库 也称为 ARC 的应用程序 该应用程序将正常启动 但当执行读取或写入静态库中的 property 的操作
  • 相对路径不适用于 css 中的图像

    我有以下文件结构 C wamp myproject admin webroot images 我有一个位于 admin 文件夹内的 index php 文件 它调用位于同一文件夹中的 header inc php 文件 header inc
  • 将 MySQL 连接到 Visual Studio C#

    我正在尝试编写数据访问代码以将 MySQL 连接到 Visual Studio 到目前为止我有这段代码 但我不知道它是否正确 我正在使用我的书 并注释掉了一些其他内容 但是当我包含注释掉的信息时 我收到了错误 public static M
  • python中最好/最容易使用的加密库是什么[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 python 加密几个文件
  • ReactiveMongo 是如何实现的,使其被认为是非阻塞的?

    阅读有关 Play Framework 和 ReactiveMongo 的文档让我相信 ReactiveMongo 的工作方式是使用很少的线程并且从不阻塞 然而 从 Play 应用程序到 Mongo 服务器的通信似乎必须发生在某处的一些线程
  • jQuery 模板 - 在模板内执行 JS 代码

    我正在尝试了解有关 jQuery 模板的更多信息 但似乎无法在模板内执行任何 JS 调用 请注意 我的 objectToString 函数从未被调用 只是呈现为字符串 我一时兴起尝试将其包装在 中 但没有成功 有谁可以帮忙吗 安东尼 你可以
  • 如何使用另一个模式的表编写存储过程?

    为了调用Oracle的函数和过程 表必须在HR用户中吗 当我从另一个用户运行函数时 它给我一个编译错误 对于我的项目 我想从另一个用户运行函数和过程 我该如何实施 要使用另一个模式中的表编写函数或过程 表所有者需要授予我们所需的权限 例如
  • 一个人可以在 Magento 社区版上托管多个商店吗?

    一个人可以在 Magento 社区版上托管多个商店吗 以及如何在设置每个新商店时自动为其创建子域 是的 您可以从 Magento 社区版运行多个站点 Magento 官方博客实际上刚刚发布了一篇关于此问题的帖子 您可能想查看一下 http
  • 我尝试实施 UPSERT 时出现问题

    我在检查更新 PostgreSQL 中的表的条件时遇到此问题 它必须检查用户是否下载过一次 如果是 则添加 1acessos
  • 如何从任何地方获取上下文? [复制]

    这个问题在这里已经有答案了 在Android中 有什么方法可以静态获取应用程序的上下文吗 例如从后台线程检索它 Thanks 最简单 也是正确 的方法是 定义一个新类 public class MyApp extends Applicati
  • hibernate查询语言还是使用条件?

    任何人告诉我使用 criteria hql sql 进行查询 要求是用户输入电子邮件或用户名 查询返回密码 来自表用户的用户 Criteria API 非常适合动态查询生成 并且是我的首选 你可以这样做 Criteria criteria
  • Git/Mercurial (hg) 意见 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 首先声明 我不是一个专业的程序员 而是一个有需要并且必须学习的工程师 我总是独自工作 所以只有我和我的七个分裂人格 我们作为一个团队工
  • 如何使用struts 2标签比较列表元素(字符串类型)和字符串(在请求范围内)

    我的列表包含 A B C D 元素
  • 如何监听 Firebase 中的特定值变化?

    My data structure is the following compliments received uid complimentId 我想听听有关恭维 已收到 uid complimentId updatedAt 的更改 我的代
  • 如何使JComboBox表格编辑器具有普通JComboBox的设计?

    我有一个JComboBox用作编辑器JTable 在图片中 您可以在标记的列中看到它们Produs 我想使用独立的设计JComboBox在网格单元中 特别是组合框的右侧部分 其中网格单元中缺少三角形 因此用户无需单击其中之一即可知道网格单元
  • 如何从具有相同签名的方法或扩展函数调用顶级函数?

    我使用科特林1 1 2 2 我想调用顶层函数plus100 Int Int从方法Mul2 plus100 Int Int 我尝试在下面的代码中执行此操作 但实际上Mul2 plus100本身被称为 class Mul2 fun plus10
  • Objective-C 属性表达式的地址

    我需要财产的访问地址 但有问题 示例代码是 interface Rectangle NSObject SDL Rect wall SDL Rect ground property SDL Rect wall property SDL Rec
  • WidgetKit @StateObject 不更新视图

    我无法理解如何让我的SwiftUI数据模型示例与我的小部件一起使用 它在我的测试应用程序中运行得很好 我立即观察到变化 当我尝试使用小部件时 我可以看到控制台中打印的数据 但我的中没有发生任何变化View in WidgetKit 我正在使