ios - Swiftui - 如何使用环境对象作为参数初始化observedObject?
问题描述
我不确定这是否是我们生活的这个勇敢的新 SwiftUI 世界中的反模式,但基本上我有一个 @EnvironmentObject ,其中保存了一些我的视图可以调用的基本用户信息。
我还有一个@ObservedObject,它拥有该视图所需的一些数据。
当视图出现时,我想使用该@EnvironmentObject 来初始化@ObservedObject:
struct MyCoolView: View {
@EnvironmentObject userData: UserData
@ObservedObject var viewObject: ViewObject = ViewObject(id: self.userData.UID)
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}
不幸的是,在初始化之前我不能在环境变量上调用 self :
“不能在属性初始化程序中使用实例成员 'userData';属性初始化程序在 'self' 可用之前运行。”
我可以看到一些可能的前进路线,但它们都感觉像黑客。我应该如何处理这个?
解决方案
这是方法(最简单的IMO):
struct MyCoolView: View {
@EnvironmentObject var userData: UserData
var body: some View {
MyCoolInternalView(ViewObject(id: self.userData.UID))
}
}
struct MyCoolInternalView: View {
@EnvironmentObject var userData: UserData
@ObservedObject var viewObject: ViewObject
init(_ viewObject: ViewObject) {
self.viewObject = viewObject
}
var body: some View {
Text("\(self.viewObject.myCoolProperty)")
}
}
推荐阅读
- javascript - 根据用户输入显示 Div
- html - 如何完美地水平对齐标志和导航栏?
- javascript - JavaScript 中的浏览器特定行为和触发级别
- r - 使用 R 函数创建序列
- go - 模板化可用于生成新代码的 Go 代码
- python - 使用正则表达式的错误 - 预期的字符串或类似字节的对象
- flutter - Flutter 如何在网格上的 TextFields 之间切换焦点(填字游戏)
- r - 在R中命名矩阵中的行
- javascript - 如何让访问我的站点的客户端发出另一个请求并在初始请求中使用其响应数据?
- python - Scrapy request get some responses, but not all