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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 08:43:06