当 UserDefaults 值更改 SwiftUI 时,@FetchRequest 谓词不更新

@FetchRequest predicate not updating when UserDefaults value changes SwiftUI

我无法弄清楚如何使 SwiftUI @FetchRequest 仅在 UserDefaults 中存储的布尔值是 true 时才使用谓词。

问题是当 showAvailable 的值改变时 FetchedResults 没有改变。目前我必须重新启动应用程序才能看到基于 showAvailable 值的结果。

struct ContentView: View {

@AppStorage("showAvailable") private var showAvailable : Bool = false


@FetchRequest private var list: FetchedResults<Item>



init() {
        @AppStorage("showAvailable") var showAvailable : Bool = false
        _list = FetchRequest(
            sortDescriptors: [],
            predicate: showAvailable ? NSPredicate(format: "parent == nil") : nil,
            animation: .default
        )
}

var body: some View {
     Button("Cancel") {
        showAvailable.toggle()
     }
}

我会在 Button 操作中使用新谓词更新获取请求,该更新应该会触发请求再次执行

struct ContentView: View {
    @AppStorage("showAvailable") private var showAvailable : Bool = false

    @FetchRequest(sortDescriptors: [], 
                  predicate: NSPredicate(value: true)
                  animation: .default)
    private var list: FetchedResults<Item>

    var body: some View {
        Button("Cancel") {
            showAvailable.toggle()
            updatePredicate()
        }
        .onAppear {
            updatePredicate()
        }
    }

    private func updatePredicate() {
        if showAvailable {
            list.nspredicate = NSPredicate(format: "parent == nil")
        } else {
            list.nspredicate = NSPredicate(value: true)
        }        
    }
}