gpt4 book ai didi

mvvm - ViewModel Async Func 完成时如何从 subview 更新 EnvironmentObject

转载 作者:行者123 更新时间:2023-12-03 10:31:13 24 4
gpt4 key购买 nike

在我的 SwiftUI 应用程序中,我有一个入口点,如下所示

@main
struct SomeApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
AppContainerView()
}
}
}
struct AppContainerView: View {
@StateObject var appState = AppState()
var body: some View {
if appState.isLoggedIn && appState.hasSeenOnboarding {
TabContainerView()
} else {
LandingView().environmentObject(appState)
}
}
}
我可以更新 isLoggedIn像这样...
class AppState: ObservableObject {
var cancellables: [AnyCancellable] = []
private let userService: UserServiceProtocol
init(userService: UserServiceProtocol = UserService()) {
self.userService = userService
subscribeForAuthChanges()
}

func subscribeForAuthChanges() {
userService.authChangeSubject.sink(receiveValue: { [weak self] auth, user in
print(auth)
if user != nil {
self?.isLoggedIn = true
}
}).store(in: &cancellables)
}

@Published var isLoggedIn = false
@Published var hasSeenOnboarding = false
}
但是说到 hasSeenOnboardingLandingView 之一的 viewModel 中完成某些网络调用后,需要将此设置为 true child 的意见。我可以做这样的事情......
struct ChildView: View {
@EnvironmentObject var appState: AppState
@StateObject var viewModel = ChildViewModel()

var body: some View {
VStack {
//...
}.onReceive($viewModel.networkCallCompleted) { completed in
self.appState.hasSeenOnboarding = completed
}
}
}
但这感觉不对……在使用 MVVM 时,这里有更好的选择来从 childView/viewModel 更改 appState 吗?或者也许是更好的方法?

最佳答案

一种可能的替代方法是通过 AppStateChildViewModel并执行AppState直接在 View 模型中更新。

struct ParentView: View {
@EnvironmentObject var appState: AppState

var body: some View {
ChildView(viewModel: ChildViewModel(appState: appState))
}
}
struct ChildView: View {
@EnvironmentObject var appState: AppState
@StateObject var viewModel: ChildViewModel

var body: some View {
...
}
}

备注
你可能想看看 依赖注入(inject) 使其更清洁。这是一个可能的例子: Simple Dependency Injection using @propertyWrapper .

关于mvvm - ViewModel Async Func 完成时如何从 subview 更新 EnvironmentObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63384925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com