[iOS] FlashList ignores RefreshControl.progressViewOffset on initial render
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 7.2k
- Forks
- 393
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 1
Description
Description
When using FlashList with a RefreshControl on iOS, the progressViewOffset prop is ignored on the initial render.
In development builds, if I change the value and trigger a hot reload, the offset suddenly starts working. After a full reload of the app, it breaks again. In a production build, it never works (since the value never changes).
Current behavior
- Initial render: progressViewOffset behaves as if it was 0, even when a value (e.g. 100) is passed.
- Hot reload with a changed value (e.g. 100 → 101): offset is applied correctly.
- Full reload: offset is ignored again.
- Production build: offset never applies.
This makes it impossible to reliably use progressViewOffset in production on iOS.
Expected behavior
The progressViewOffset should be respected immediately on the first render, without requiring a hot reload or remount.
Reproduction
Steps to reproduce:
- Render a FlashList with a RefreshControl using progressViewOffset={100}.
- Pull to refresh → indicator appears at offset 0.
- Change the value (100 → 101) and save (hot reload).
Offset now works correctly. - Fully reload the app (Cmd+R).
Offset breaks again. - Build for production.
Offset never applies.
Expo Snack or minimal reproduction link:
https://snack.expo.dev/@blockoutproject/flashlist-progressviewoffset
(BTW I use a safeAreaView but It also doesn't render on initial render ...)
Platform
- iOS
- Android
- Web (if applicable)
Environment
React Native info output:
Binaries:
Node:
version: 22.12.0
path: ~/.nvm/versions/node/v22.12.0/bin/node
Yarn:
version: 1.22.22
path: ~/.nvm/versions/node/v22.12.0/bin/yarn
npm:
version: 11.5.2
path: ~/.nvm/versions/node/v22.12.0/bin/npm
Watchman:
version: 2024.12.02.00
path: /opt/homebrew/bin/watchman
Managers:
CocoaPods:
version: 1.16.2
path: /opt/homebrew/bin/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 24.2
- iOS 18.2
- macOS 15.2
- tvOS 18.2
- visionOS 2.2
- watchOS 11.2
Android SDK: Not Found
IDEs:
Android Studio: 2024.3 AI-243.25659.59.2432.13423653
Xcode:
version: 16.2/16C5032a
path: /usr/bin/xcodebuild
Languages:
Java:
version: 21.0.3
path: /usr/bin/javac
Ruby:
version: 2.6.10
path: /usr/bin/ruby
npmPackages:
"@react-native-community/cli":
installed: 20.0.2
wanted: latest
react:
installed: 19.1.0
wanted: 19.1.0
react-native:
installed: 0.81.4
wanted: 0.81.4
react-native-macos: Not Found
npmGlobalPackages:
"react-native": Not Found
Android:
hermesEnabled: true
newArchEnabled: true
iOS:
hermesEnabled: true
newArchEnabled: true
FlashList version: 2.0.2
Additional context
I've tried switching back to FlatList and the problem is gone.
Checklist
- I've searched existing issues and couldn't find a duplicate
- I've provided a minimal reproduction (Expo Snack preferred)
- I'm using the latest version of @shopify/flash-list
- I've included all required information above
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked Expo Snack reproduction and inspect FlashList's RefreshControl integration for the initial-render path on iOS. Compare its behavior with FlatList using progressViewOffset; done means the offset is applied on the first render and remains correct after full reloads and in production builds.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- ios, react-native, typescript
- Domain
- mobile
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100