根据观察到的变量的变化更新@Published变量

2024-01-07

我有一个可以观察到的 AppState:

class AppState: ObservableObject {

    private init() {}
    static let shared = AppState()

    @Published fileprivate(set) var isLoggedIn = false

}

视图模型应该根据状态决定显示哪个视图(isLoggedIn):

class HostViewModel: ObservableObject, Identifiable {

    enum DisplayableContent {
        case welcome
        case navigationWrapper
    }

    @Published var containedView: DisplayableContent = AppState.shared.isLoggedIn ? .navigationWrapper : .welcome

}

最后一个HostView观察到containedView属性并根据它显示正确的视图。

我的问题是isLoggedIn上面的代码没有被观察到,我似乎无法找到一种方法来做到这一点。我很确定有一个简单的方法,但经过 4 小时的反复试验,我希望这里的社区可以帮助我。


工作解决方案:

使用组合两周后,我现在再次修改了之前的解决方案(请参阅编辑历史记录),这是我现在能想到的最好的解决方案。这仍然不完全是我的想法,因为contained不是同时订阅者和发布者,但我认为AnyCancellable总是需要的。如果有人知道实现我的愿景的方法,请仍然告诉我。

class HostViewModel: ObservableObject, Identifiable {

    @Published var contained: DisplayableContent
    private var containedUpdater: AnyCancellable?

    init() {
        self.contained = .welcome
        setupPipelines()
    }

    private func setupPipelines() {
        self.containedUpdater = AppState.shared.$isLoggedIn
            .map { $0 ? DisplayableContent.mainContent : .welcome }
            .assign(to: \.contained, on: self)
    }

}

extension HostViewModel {

    enum DisplayableContent {
        case welcome
        case mainContent
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据观察到的变量的变化更新@Published变量 的相关文章

随机推荐