You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI开发报错:Cannot find viewModel in scope 求助

解决“Cannot find viewModel in scope”报错的步骤

1. 完善AppViewModel的实现

你的AppViewModel缺少必要的响应式属性和登录方法,先补充完整:

import FirebaseAuth

class AppViewModel: ObservableObject {
    let auth = Auth.auth()
    @Published var signedIn = false // 用于驱动UI更新的登录状态
    
    // 判断当前是否已登录的计算属性
    var isSignedIn: Bool {
        return auth.currentUser != nil
    }
    
    // 实现Firebase登录逻辑
    func signIn(email: String, password: String) {
        auth.signIn(withEmail: email, password: password) { [weak self] result, error in
            guard let self = self else { return }
            if let error = error {
                print("登录失败: \(error.localizedDescription)")
                return
            }
            self.signedIn = self.isSignedIn
        }
    }
}

2. 让SignInView获取到viewModel实例

SignInView里没有声明viewModel的引用,同时还缺失输入框的状态变量,这里提供两种常用解决方式:

方式一:使用环境对象(推荐,适合全局共享的ViewModel)

在SignInView中添加环境对象属性和输入状态:

struct SignInView: View {
    @EnvironmentObject var viewModel: AppViewModel
    @State private var email = "" // 邮箱输入状态
    @State private var password = "" // 密码输入状态
    
    var body: some View {
        VStack {
            // 补充邮箱输入框
            TextField("邮箱", text: $email)
                .textFieldStyle(.roundedBorder)
                .padding()
            
            // 补充密码输入框
            SecureField("密码", text: $password)
                .textFieldStyle(.roundedBorder)
                .padding()
            
            Button("Sign-In"){ 
                guard !email.isEmpty, !password.isEmpty else {
                    return
                }
                viewModel.signIn(email: email, password: password)
            }
        }
    }
}

方式二:通过参数传递ViewModel

如果不需要全局共享ViewModel,也可以直接传参:

// 在ContentView中修改SignInView的调用
SignInView(viewModel: viewModel)

// 修改SignInView的定义
struct SignInView: View {
    let viewModel: AppViewModel
    @State private var email = ""
    @State private var password = ""
    
    // 其余代码与方式一一致
}

3. 在App入口注入ViewModel实例

确保在App的根视图层级注入AppViewModel实例,这样环境对象才能在所有子视图中生效:

@main
struct YourAppName: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(AppViewModel()) // 注入ViewModel实例
        }
    }
}

内容的提问来源于stack exchange,提问作者glensoehnchen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:03:00