我有一个可以观察到的 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(使用前将#替换为@)