SwiftUI预览中SwiftData初始化顺序异常导致视图逻辑错误的解决方案求助
SwiftUI预览中SwiftData初始化顺序异常导致视图逻辑错误的解决方案求助
大家好,我现在在给HomeView做SwiftUI预览的时候遇到了SwiftData初始化顺序的问题,想请各位帮忙看看怎么解决。
在模拟器和真机上,我的HomeView功能是正常的——它会通过SwiftData检查用户资料是否完整,如果没有找到用户记录,就弹出一个表单让用户填写信息。但到了预览里,不管我怎么模拟用户数据,这个表单总是会弹出来。我发现问题出在SwiftData的加载时机:预览里SwiftData好像是在视图生命周期的onAppear之后才完成加载的,所以onAppear里的检查根本找不到提前添加的模拟用户数据。
我的HomeView代码如下:
import SwiftUI import SwiftData struct HomeView: View { @Bindable var loginManager: LoginManager @Environment(\.modelContext) private var modelContext @State var showFillUserProfile: Bool = false var body: some View { VStack { Text("Welcome to Home!") .font(.largeTitle) .padding() Text(loginManager.credentials.name) .font(.largeTitle) .padding() Text(loginManager.credentials.surname) .font(.largeTitle) .padding() Text(loginManager.credentials.email) .font(.largeTitle) .padding() Text("You are logged in.") .font(.title) } .onAppear(perform: { loginManager.checkUserInfoExists() // check if user info exists }) .onAppear(perform: { print("val of self.shouldShowFillUserProfile " + "\(loginManager.shouldShowFillUserProfile)") }) .sheet(isPresented: .constant(loginManager.shouldShowFillUserProfile)) { FillUserProfileView(loginManager: loginManager) } } }
预览代码是这样的:
#Preview { let preview = Preview() preview.addUser(user: UserModel.sample) // add user here -------------- let loginManager = MockLoginManager(context: preview.container.mainContext) loginManager.setProfileCompleted(true) let appManager = AppManager(mc: preview.container.mainContext) loginManager.shouldShowFillUserProfile = false return MainTabView(loginManager: loginManager) .modelContainer(preview.container) .environment(appManager) }
我尝试在预览里提前添加了示例用户数据,还手动设置了loginManager.shouldShowFillUserProfile = false,但好像都没用,因为onAppear触发的时候SwiftData还没加载好那个模拟用户,导致检查逻辑还是认为没有用户资料,表单就弹出来了。有没有什么办法能让预览里的SwiftData在视图初始化前就完成数据加载,或者调整一下我的逻辑顺序?
备注:内容来源于stack exchange,提问作者Damiano Miazzi
相关产品推荐
相关产品推荐

