SwiftUI调用函数报Type '()' cannot conform to 'View'错误如何解决
错误原因
这个报错的核心原因是SwiftUI的body属性要求返回值必须是符合View协议的类型,你直接在body的else分支中调用regiterUserAppleBlog函数,该函数返回值是Void(也就是空类型()),自然无法符合View协议的要求。
另外你在函数的异步回调中直接返回MainTabView的写法也是错误的:异步回调执行时,body的渲染流程已经结束,无法再通过回调返回视图。
修复方案
你需要通过状态变量驱动视图渲染,流程如下:
- 新增一个状态变量存储用户文档是否存在的查询结果,用可选型标记初始未查询的状态
- 把异步查询逻辑放到
onAppear修饰符中执行,查询完成后修改状态变量 body中只根据状态变量的值返回对应视图即可
修改后完整代码
struct ContentView: View { @EnvironmentObject var viewModel: AuthViewModel @State var registerUser: Bool = false @State var selectedIndex = 0 // 新增状态变量:nil=查询中,true=文档存在,false=文档不存在 @State private var userDocumentExists: Bool? var body: some View { Group { if viewModel.userSession == nil { AppPreview() } else { // 根据查询状态返回对应视图 switch userDocumentExists { case nil: // 查询中展示加载态 ProgressView("加载中...") case true: if let user = viewModel.currentUser { MainTabView(user: user, selectIndex: $selectedIndex) } else { // 兜底加载态 ProgressView() } case false: // 文档不存在,展示引导创建文档的视图 CreateUserDocumentView() } } } // 视图出现时执行查询逻辑 .onAppear { guard let uid = ACFF.UID else { return } regiterUserAppleBlog(uid: uid) { isExist in userDocumentExists = isExist } } } func regiterUserAppleBlog(uid:String,completion :@escaping (Bool) -> (Void)) { COLLECTION_USRES.whereField("uid", isEqualTo: uid).getDocuments { snapshot, _ in guard let documents = snapshot?.documents else { completion(false) return } completion(!documents.isEmpty) } } }
额外注意事项
- 原代码中对
snapshot?.documents.count做强制解包有崩溃风险,上面代码中已经替换为可选绑定的安全写法 - 你可以根据自己的业务需求替换
CreateUserDocumentView()为实际的引导创建文档的视图
内容的提问来源于stack exchange,提问作者Alejandra Hernandez
相关产品推荐
相关产品推荐

