我使用@EnvironmentObject
是这样的:
struct MyView: View {
@EnvironmentObject var object: MyObject
...
}
但我的代码不需要object
有值。
仅仅将其设为可选并不起作用(甚至不能编译-Property type 'MyObject?' does not match that of the 'wrappedValue' property of its wrapper type 'EnvironmentObject'
)
你也不能传入一个默认对象(这也可以解决我的问题)--要么作为属性的初始值,要么作为@EnvironmentObject
的参数。例如,这些不起作用:
@EnvironmentObject var object: MyObject = MyObject()
@EnvironmentObject(MyObject()) var object: MyObject
我尝试用自己的属性 Package 器 Package @EnvironmentObject
,但根本不起作用。
我也尝试过 Package 对object属性的访问,但它不会抛出一个可以被捕获的异常,它会抛出一个fatalError
。
是我遗漏了什么,还是我只是在尝试不可能的事情?
5条答案
按热度按时间irlmq6kh1#
它不是一个非常优雅的,如果EnvironmentObject中的任何更改(以及其他警告),它很容易被破坏,但是如果你在SwiftUI 1 / Xcode 11中打印EnvironmentObject。3.1您将获得:
EnvironmentObject<X>(_store: nil, _seed: 1)
那么这样如何:
kninwzqo2#
通过遵循
EnvironmentKey
,你基本上可以提供一个默认值,SwiftUI可以在丢失的情况下安全地回退。此外,您还可以利用EnvironmentValues
通过基于密钥路径的API访问对象。您可以将两者结合起来,如下所示:
现在要从视图访问新对象:
好好享受吧
zdwk9cvp3#
我知道你告诉过你不能把你的对象放到一个 Package 器里,但是我认为这个解决方案是一个很好的方法来实现你想要的。
你唯一要做的就是创建一个非可选的 Package 器,但它将包含你的可选对象:
然后,创建视图并将 Package 器分配给环境:
在您的视图中,您现在可以检查对象的存在:
如果任何视图改变
objectWrapper.object
,视图将被重新加载。您可以轻松地模拟视图,甚至在几秒钟后触发更改以检查转换:
tktrz96b4#
我做了一个基于
StateObject
的 Package 器,并通过@autoscaping
闭包对默认值进行了惰性初始化。而且,如果你通过一个环境传递一个对象,它也不必存储在某个地方
密码
w9apscun5#
这个简短的属性 Package 器将跟踪保存在
Environment
中的ObservableObject
的更改。它使用DynamicProperty.update()
开始跟踪通过Environment
传入的对象。原来的问题是关于nil对象的。如果需要,可以将
var object: Object
更改为可选。