fix onLayout floating point numbers using roundToNearestPixel #794
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Hi!
I've been using RecyclerListView (and now FlashList) for many years in my project.
I've applied many patches to address different issues, but I’ve noticed that many of them share the same root cause: a probable floating-point precision issue related to React Native's
onLayoutevent.Here’s an example of the
event.nativeEvent.layoutoutput for seven identical horizontal list components with different data:Those affected by the floating-point issue experienced problems such as being unable to click on an item or scroll to the last item
There are many ways to handle this issue, but we don’t want to rely on external dependencies. Instead, we want to track only the changes that produce actual visual differences on screen.
In other words, we don’t want to simply
Math.roundthe values, as that would prevent us from detecting changes smaller than 1 dp. On a device with a pixel ratio of 3, we need to track changes as small as 0.333333 (which corresponds toStyleSheet.hairlineWidth).That’s why I believe
PixelRatio.roundToNearestPixelis a good candidate for this fix: regardless of the reason for the onLayout changes, if a change isn’t significant enough to produce a visible difference on screen, then no action should be taken.