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

GeometryReader包裹ContentView导致EnvironmentObject属性重置问题咨询

问题原因与解决方法

为什么GeometryReader会导致EnvironmentObject属性重置?

GeometryReader是一个依赖布局上下文的视图,它的闭包会在布局发生变化时重新执行——哪怕你的应用不支持横屏,像状态栏高度变化、弹窗显示/隐藏、系统UI状态变更这类场景,都可能触发它的布局更新。

你把AuthViewModel()的创建放在GeometryReader的闭包内部,意味着每次闭包重新执行时,都会生成一个全新的AuthViewModel实例,之前的状态自然就被重置了。而移除GeometryReader后,AuthViewModel()只在MyApp的body初始化时创建一次,状态就能持续保留。

修复方法

把AuthViewModel的实例化移到GeometryReader外部,保证它只被创建一次:

@main
struct MyApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    // 用@StateObject保证实例仅初始化一次,生命周期跟随App
    @StateObject private var authVM = AuthViewModel()
    
    var body: some Scene {
        WindowGroup {
            GeometryReader { proxy in
                ContentView()
                    .environmentObject(authVM)
                    .environment(\.mainWindowSize, proxy.size)
            }
        }
    }
}

这样不管GeometryReader的闭包执行多少次,传递给ContentView的都是同一个AuthViewModel实例,状态就不会丢失了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:15:28