如何在 SwiftUI 中使用 EnvironmentObject 初始化 State 属性?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中使用 EnvironmentObject 初始化 State 属性?【英文标题】:How to use EnvironmentObject to initialize State Property in SwiftUI? 【发布时间】:2021-01-15 15:59:24 【问题描述】:

我在使用来自 EnvironmentObject 的数据初始化 State 时遇到了一个小问题。

@EnvironmentObject var settings: Settings
    
@State var localAllowReminders: Bool
    
init() 
    self._localAllowReminders = State(initialValue: settings.allowReminders)

显然,我收到以下错误消息:'self' used before all stored properties are initialized.

问题:如何使用 EnvironmentObject 中的数据初始化状态?

感谢您的帮助。

【问题讨论】:

你最好不要使用@EnvironmentObject,而是正确注入Settings并将其存储为@ObservedObject 【参考方案1】:

EnvironmentObject 是在 视图构造函数调用之后注入的,因此您必须将状态初始化为某个默认值并在顶部视图 onAppear 修饰符中将其重置为所需的值,例如

@EnvironmentObject var settings: Settings
@State var localAllowReminders: Bool = false   // << just any default
    
var body: some View 
    VStack        // << any top view
        // ...
    
    .onAppear 
       self.localAllowReminders = settings.allowReminders   // << here !!
    

【讨论】:

请问你是怎么知道EnvironmentObject是在视图构造函数调用后注入的? @onthemoon,当我尝试从 .onAppear 方法访问环境对象时出现错误 No ObservableObject of type "" found

以上是关于如何在 SwiftUI 中使用 EnvironmentObject 初始化 State 属性?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:Gesture var 是不是可能移入 EnvironmentObject?

如何在 SwiftUI 中使用 Realm

如何使用 SwiftUI 在 UICollectionViewCell 中填充内容

如何在 UIkit 中添加 SwiftUI 对象

如何在 SwiftUI 中使用 SFSafariViewController?

解决运行maven 出现-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environme