“在范围内找不到 viewModel”

问题描述 投票:0回答:3

我开始使用 SwiftUI 编码并制作一些项目,一切正常,但随后弹出错误“无法在范围内找到 viewModel” 我查看了代码,但在我看来是范围内的 viewModel。

这是我的代码:

import FirebaseAuth

class AppViewModel: ObservableObject {
        let auth = Auth.auth()
    }
}

struct ContentView: View {
    @EnvironmentObject var viewModel: AppViewModel
    var body: some View {
        NavigationView {
            if viewModel.signedIn {
                Text("You are Signed In")
            } else {
                SignInView()
            }
        }
        .onAppear {
            viewModel.signedIn = viewModel.isSignedIn
        }
    }
}

struct SignInView: View {
    var body: some View {
        VStack {      
            Button("Sign-In"){ 
                guard !email.isEmpty, !password.isEmpty else {
                    return
                }
                **viewModel.signIn(email: email, password: password)**
            }
        }
    }
}```
ios swift firebase swiftui viewmodel
3个回答
0
投票

您需要将 viewModel 传入

SignInView
。此视图可能由包含 viewModel 的 ContentView 显示,但 SignInView 本身不知道 viewModel 是什么或从哪里获取它。

关于“如何”:

struct SignInView: View {
    @StateObject var viewModel: AppViewModel
    ...
}

这样做,视图现在知道它的初始化器需要一个参数。您现在将在使用

SignInView
的地方遇到编译器错误。现在只需将该行更改为
SignInView(viewModel: viewModel)
,你就可以开始了。


0
投票

声明

EnvironmentObject
不会创建它的实例。它只是说您已经在层次结构的上方某处设置了
.environmentObject
,并且您可以在此视图中使用它。然而,如果你得到错误,你显然没有设置它。

或者,您可以使用

@StateObject
来定义该视图可用的 viewModel,但即使那样它也不会是实例,除非您在代码或其声明中实例化它。


0
投票

尝试这种方法,在您的应用程序中声明一个

@StateObject var viewModel = AppViewModel()
,并将其传递给所有其他视图:

@main
struct YourApp: App {
    @StateObject var viewModel = AppViewModel()  // <-- here

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(viewModel)  // <-- here
        }
    }
}

class AppViewModel: ObservableObject {
        @Published var signedIn: Bool = false  // <--- here
        // ....
        let auth = Auth.auth()
        // .... 
    }
}

struct ContentView: View {
    @EnvironmentObject var viewModel: AppViewModel

    var body: some View {
        NavigationView {
            if viewModel.signedIn {
                Text("You are Signed In")
            } else {
                SignInView()
            }
        }
        .onAppear {
            // --- here, meaningless
            // viewModel.signedIn = viewModel.isSignedIn
        }
    }
}

struct SignInView: View {
    @EnvironmentObject var viewModel: AppViewModel  // <-- here
    // ....

    var body: some View {
        VStack {
            Button("Sign-In"){
                guard !email.isEmpty, !password.isEmpty else {
                    return
                }
                viewModel.signIn(email: email, password: password)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.