scrollPosition不更新问题:$scrollPosition赋值异常且onChange未触发?
问题原因及解决方案
你的代码存在两个关键问题,导致scrollPosition无法正确赋值、onChange从未触发:
1. 缺少滚动行为配置
scrollPosition依赖视图对齐的滚动行为才能追踪位置变化,默认情况下List不会启用该行为。同时需确保scrollTargetLayout()作用于包含所有滚动项的容器(你的代码中位置正确,但缺失行为配置)。
2. List行ID关联不明确
虽然你给文本视图设置了.id(product.id),但List的行容器可能使用默认ID覆盖自定义设置,导致系统无法正确关联滚动项与追踪ID。
修改后的完整代码
@Model final class Product { var name: String = "" var brand: String = "" init(name: String, brand: String) { self.name = name self.brand = brand } } struct ProductListView: View { @Environment(\.modelContext) private var modelContext @Query private var products: [Product] @State private var scrollPosition: Product.ID? var body: some View { NavigationStack { List { ForEach(products, id: \.id) { product in // 明确指定ID路径 Text(product.name) } .scrollTargetLayout() } .scrollTargetBehavior(.viewAligned) // 添加视图对齐的滚动行为 .scrollPosition(id: $scrollPosition) .onChange(of: scrollPosition) { oldValue, newValue in print("scrollPosition changed from \(oldValue) to \(newValue)") } } } }
额外注意事项
- 确保项目运行在**iOS 17.0+**或对应版本的苹果系统上,
scrollPosition与scrollTargetLayout()是iOS 17新增API。 - 确认
products数组非空,无数据时自然无法追踪滚动位置。 - 滚动时需让列表项完全进入视图(达到对齐阈值),
scrollPosition才会更新,轻微滚动可能不会触发回调。
内容的提问来源于stack exchange,提问作者chepiok
相关产品推荐
相关产品推荐

