Bug P2
Status Update
Comments
kl...@google.com <kl...@google.com> #2
With the change of lifecycle-common
to KMP, we might be able to just move this into the right spot (since it'll mirror the same structure as lifecycle-runtime
, which does work).
ap...@google.com <ap...@google.com> #3
lifecycle-common
even after conversion to KMP is still a jar. We do not want to change that to an AAR as that is a breaking change for consumers, so i dont think we can make it work this project.
Description
If
ScrollableState.animateScrollBy
is called and then before it completes it is called again in another coroutine, the first animation will be cancelled before starting the second one. However, unlike calls toAnimatable.animateTo
, the velocity of the previous animation will not be preserved.Possible solutions
This isn't a trivial fix because
ScrollableState
itself does not keep any animation or velocity state –animateScrollBy
is an extension function. It also does not provide any signal about whether it's being scrolled by an animation or the user, so if we track the velocity externally then we could end up in a weird state if the user interrupts an animation.Option 1: Move
animateScrollBy
intoScrollableState
This would allow
ScrollableState
to keep track of animated scroll velocity internally. It should also allow it to be reset to zero when the animation is interrupted by a user scroll. However,ScrollableState
is a public interface so to avoid breaking binary compatibility we would need to wait for Kotlin 1.6.20 and then give it a default implementation. The default implementation could simply be the current implementation.Option 2: Expose scroll velocity from
ScrollableState
I'm not sure how feasible this is – tracking velocity requires tracking timestamps, which
ScrollableState
does not currently do and would probably make the API super gross.