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

