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
相关产品推荐
相关产品推荐

