如何使用Swift宏与@Observable和@Environment?

5f0d552i  于 11个月前  发布在  Swift
关注(0)|答案(1)|浏览(131)

我尝试使用新的Swift宏,使用@Observable和@Environment,代码如下:

import SwiftUI
import Observation

@Observable class Note {
    var text = ""
}

struct ContentView: View {
    @State var note = Note()
    
    var body: some View {
        FormView()
            .environment(note)
    }
}

struct FormView: View {
    @Environment(Note.self) var note
    
    var body: some View {
        Form {
            TextField("write here", text: $note.text)
        }
    }
}

但是,它无法生成,并出现以下错误:
Cannot find '$note' in scope
删除$note中的$会导致:
Cannot convert value of type 'String' to expected argument type 'Binding<String>'

cgvd09ve

cgvd09ve1#

目前(从iOS 17/macOS 15 beta 2开始),通过@Environment对象接收的对象不能直接绑定。
解决方法(如苹果工程师在WWDC slack room中所建议的)是在body中重新声明一个可绑定的本地引用:

struct FormView: View {
    @Environment(Note.self) var note
    
    var body: some View {
        @Bindable var note = note // add this line
        Form {
            TextField("write here", text: $note.text)
        }
    }
}

如果您对此感到沮丧,请向Apple提交反馈报告-我们向他们提供的有关此类元素的反馈越多,修复的优先级可能就越高。

相关问题