environment-variables - 属性类型“Int”与其包装器类型“EnvironmentObject”的“wrappedValue”属性不匹配
问题描述
我正在尝试使用 @EnvironmentObject 将数据传递给我的 SwiftUI 视图:
struct MyView: View {
@EnvironmentObject var myInt: Int // ❌ Property type 'Int' does not match that of the 'wrappedValue' property of its wrapper type 'EnvironmentObject'
var body: some View {
EmptyView()
}
}
func constructView() {
let myInt = 1
MyView()
.environmentObject(myInt)
}
带有@EnvironmentObject 的行有一个编译器错误(如上所列)。
如何@EnvironmentObject
使用Int
?
更新:一个想法是@EnvironmentObject
只能与符合的类一起使用ObservableObject
,所以我尝试切换到@Environment
现在编译的部分,但产生了不同的错误:
struct MyView: View {
@Environment var myInt: Int
var body: some View {
EmptyView()
}
}
func constructView() {
let myInt = 1
MyView() // ❌ Missing argument for parameter 'myInt' in call
.environment(\.myInt, myInt)
}
现在,当我尝试构建它时,它抱怨myInt
未设置。
解决方案
@EnvironmentObject
只能与 a 一起使用class
。Int
实际上是一个struct
。
如果您确实想尝试在 sInt
之间共享它View
,您可以将值包装在一个类中:
class SharedInt: ObservableObject {
@Published var myInt = 1
}
此外,它应该看起来更像这样SceneDelegate.swift
:
let contentView = ContentView().environmentObject(SharedInt())
if let windowScene = /* ... */
或者在 SwiftUI 生命周期中...App.swift
:
WindowGroup {
ContentView()
.environmentObject(SharedInt())
}
推荐阅读
- c# - 如何根据值选择 ItemTemplate?
- swift - 何时调用 CellForRowAt?-- 排队等到 VC 位居榜首?
- c++ - 是否可以在 WatchOS / WatchKit 应用程序中使用 C++ 代码
- python - 上传文件后返回对象ID
- python - 当轮班是动态的并且每个员工都有不同的约束时,如何按周添加员工约束?
- python - 如何去除重复的新行?
- sql - 如果子查询返回任何结果,如何返回布尔值
- amazon-web-services - AWS S3 对象是否支持 POSIX 硬链接?
- javascript - 几十年来如何使用javascript函数dateFormat?
- java - 为什么弹簧方法注入在 Kotlin 中不起作用?