我开始使用 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)**
}
}
}
}```
您需要将 viewModel 传入
SignInView
。此视图可能由包含 viewModel 的 ContentView 显示,但 SignInView 本身不知道 viewModel 是什么或从哪里获取它。
关于“如何”:
struct SignInView: View {
@StateObject var viewModel: AppViewModel
...
}
这样做,视图现在知道它的初始化器需要一个参数。您现在将在使用
SignInView
的地方遇到编译器错误。现在只需将该行更改为SignInView(viewModel: viewModel)
,你就可以开始了。
声明
EnvironmentObject
不会创建它的实例。它只是说您已经在层次结构的上方某处设置了.environmentObject
,并且您可以在此视图中使用它。然而,如果你得到错误,你显然没有设置它。
或者,您可以使用
@StateObject
来定义该视图可用的 viewModel,但即使那样它也不会是实例,除非您在代码或其声明中实例化它。
尝试这种方法,在您的应用程序中声明一个
@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)
}
}
}
}