退出AVPlayerViewController全屏时SwiftUI视图重加载问题求助
1. UIViewControllerRepresentable 视图重建触发父视图连锁刷新
你的FullscreenVideoPlayer是基于UIViewControllerRepresentable的包装视图,当AVPlayerViewController退出全屏时,SwiftUI的视图生命周期机制可能会销毁并重建这个包装视图。由于SwiftUI视图是值类型,一旦该视图的绑定状态(比如player)或父视图状态发生变动,就会触发整个包含它的HStack重新渲染,导致所有VideoLoadingView被初始化,若VideoLoadingView在初始化阶段就发起数据请求,自然会造成重复请求。
2. ForEach 使用索引作为标识引发全量渲染
你通过ForEach(videos[channel]?.indices ?? [].indices)遍历视频列表,这里用数组索引(Int)作为视图标识。当current_playing变化时,SwiftUI会认为所有索引对应的视图内容(显示播放器还是加载视图)都发生了变化,进而销毁旧视图并创建新视图。这直接导致所有非当前播放项的VideoLoadingView被重新创建,触发重复的数据请求。
3. 自定义 ScrollingHStackModifier 可能存在不必要的刷新逻辑
你给HStack添加了ScrollingHStackModifier,如果这个自定义Modifier内部通过@Binding var current监听current_playing,退出全屏时可能触发current_playing的变动(或Modifier内部状态更新),进而导致整个HStack及其子视图被全量重新渲染。若Modifier没有正确处理状态依赖,就会放大刷新范围,引发不必要的视图重建。
4. @State 变量 player 的状态传播导致父视图刷新
player用@State声明,当AVPlayer退出全屏时,其内部播放状态、当前播放项等可能发生变化,触发@State的更新。由于FullscreenVideoPlayer绑定了这个player,状态变化会向上传递到父视图,导致父视图的body重新计算,最终引发所有子视图的重新渲染。
内容的提问来源于stack exchange,提问作者caseytraina

