onViewableItemsChanged isn't correct without specifying the header height in getItemLayout
还没有人认领这个 Issue。
- 主要语言
- C++
- 星标
- 127k
- 派生
- 25.3k
- 平均合并
- 1 天 23 小时
- 30 天内合并 PR
- 4
描述
Description
I am unsure if this is a bug or expected behaviour. If it's the latter then could be worth adding to the docs.
Also I can only test on my version (0.73.8) unfortunately. But I can't find any issues that suggest it's been fixed recently, so hopefully a useful issue for people. At the very least I couldn't find anything about this online so maybe useful for others.
If I have a simple Flatlist with a header like this:
<FlatList
data={Array.from({ length: 20 })}
renderItem={({ index }) => (
<V height={index === 1 ? 250 : 150} p={20} dbg>
<T>{index}</T>
</V>
)}
getItemLayout={(data, index) => {
if (index === 0) {
return { length: 150, offset: 200, index }
}
if (index === 1) {
return { length: 250, offset: 150 + 200, index }
}
return { length: 150, offset: 150 * (index - 2) + 200 + 150 + 200, index }
}}
ListHeaderComponent={<V height={200} width="100%" />}
viewabilityConfig={viewabilityConfig}
onViewableItemsChanged={({ viewableItems }) => {
console.log('>>>', viewableItems, viewableItems.length)
}}
/>
If I remove the header height (200) from the getItemLayout offset calculation, onViewableItemsChanged fires incorrectly.
If I remove getItemLayout entirely, the logic works fine regardless.
I would have thought by the time the layout has rendered, the onViewableItemsChanged logic would be able to use the actual layout value vs relying on getItemLayout? It would certainly make things robust for us since the header height is quite dependent on various things.
Steps to reproduce
Run the code snippet above. Scroll down and observe that onViewableItemsChanged fires correctly. Remove 200 from getItemLayout calculation and observe it is now incorrect.
React Native Version
0.73.8
Affected Platforms
Runtime - Android, Runtime - iOS
Output of npx react-native info
System:
OS: macOS 14.4
CPU: (8) x64 Apple M1 Pro
Memory: 29.45 MB / 16.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 18.19.1
path: ~/.nvm/versions/node/v18.19.1/bin/node
Yarn:
version: 1.17.3
path: ~/.yarn/bin/yarn
npm:
version: 10.2.4
path: ~/.nvm/versions/node/v18.19.1/bin/npm
Watchman:
version: 2024.12.02.00
path: /usr/local/bin/watchman
Managers:
CocoaPods:
version: 1.15.2
path: /Users/mattdalton/.rvm/gems/ruby-2.7.7/bin/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 23.5
- iOS 17.5
- macOS 14.5
- tvOS 17.5
- visionOS 1.2
- watchOS 10.5
Android SDK: Not Found
IDEs:
Android Studio: 2021.2 AI-212.5712.43.2112.8609683
Xcode:
version: 15.4/15F31d
path: /usr/bin/xcodebuild
Languages:
Java:
version: 17.0.10
path: /usr/bin/javac
Ruby:
version: 2.7.7
path: /Users/mattdalton/.rvm/rubies/ruby-2.7.7/bin/ruby
npmPackages:
"@react-native-community/cli": Not Found
react:
installed: 18.2.0
wanted: 18.2.0
react-native:
installed: 0.73.8
wanted: ^0.73.8
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled: true
newArchEnabled: false
iOS:
hermesEnabled: true
newArchEnabled: false
Stacktrace or Logs
N/A
Reproducer
https://github.com/matt-dalton/flatlistviewable
Screenshots and Videos
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
使用 React Native 0.73.8,从链接的 flatlistviewable 复现程序及其 FlatList 入口点开始。在 Android 和 iOS 上,比较有无 getItemLayout 以及 ListHeaderComponent 的 200px 偏移时 onViewableItemsChanged 的行为。确定该行为是 bug 还是预期行为,并添加回归测试或记录所需的偏移后,即视为完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- javascript, react-native
- 领域
- mobile
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100