jenly1314/UltraSwipeRefresh

有很大几率,无法触发下拉

liu-xinhui opened this issue · 30 comments

看视频,多拉几次,有时候就会导致无论怎么拉都无法触发刷新,必须松开手再次尝试才可以。

638_1716118562.mp4

看视频,多拉几次,有时候就会导致无论怎么拉都无法触发刷新,必须松开手再次尝试才可以。

638_1716118562.mp4

我测试是正常的;有更详细的重现步骤说明吗?

我这个小米手机,其他手机未测试。其中一个重现步骤是:
下拉后别释放,用手给他推回去,再次下拉几乎100%无法再次下拉,全程手指不能离开屏幕。

并且不能下拉之后,手指离开屏幕,立即再次下拉也是不行的,必须延迟一下,再尝试下拉才可以

你看我新视频,下拉后推回去,只要手指不松开,或者松开后立即下拉(视频中手指松开好几次)。都是无法再次触发下拉刷新。

639_1716170817.mp4

按照你的描述进行操作,依然无法复现;

确认一下你测试时的两个关键信息,便于分析原因。

  1. 是否是下载演示App进行测试的?
  2. 所使用的机型与Android系统版本?

1.使用的是演示app
2.机型是红米Turbo 3,系统是澎湃os1.1.11.0,android14
image
image

感觉是缩放动画引起的,在这个手机上LazyColumn,拖曳时会有微小的上下缩放效果,只要这个缩放效果出现,就无法下拉。

感觉是缩放动画引起的,在这个手机上LazyColumn,拖曳时会有微小的上下缩放效果,只要这个缩放效果出现,就无法下拉。

初步判定可能是手机兼容性问题,因为我怎么上下乱滑都无法出现你说的情况;所以还需要再确认下,你可以换其他的手机试试,我抽空也找个小米的手机试试。(记得MIUI是好像有个列表回弹的效果。)

模拟器中也可以复现,android 14

642_1716275962.mp4
企业微信20240521-152401@2x

感觉是缩放动画引起的,在这个手机上LazyColumn,拖曳时会有微小的上下缩放效果,只要这个缩放效果出现,就无法下拉。

换个手机已复现此问题;这个细节很重要,你猜的没错,就这个引起的。

已修改此问题,你可以下载最新的演示App进行验证。

试过了,现在没问题了,什么时候发布到maven仓库呢

我也遇到了,也是有弹性,有什么办法解决吗?

CompositionLocalProvider(
LocalOverscrollConfiguration provides null
) {
}

禁用边界滚动完美解决

CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { }

禁用边界滚动完美解决

确实,这个方法完美解决。修复后的版本还是有一定几率无法触发下拉刷新的,只是我试了其他app也都有同样的问题,比如今日头条。所以就没提。用了你这个办法,可以100%触发下拉,非常感谢。

CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { }
禁用边界滚动完美解决

确实,这个方法完美解决。修复后的版本还是有一定几率无法触发下拉刷新的,只是我试了其他app也都有同样的问题,比如今日头条。所以就没提。用了你这个办法,可以100%触发下拉,非常感谢。

  1. 按照之前的步骤能复现么?
  2. 如果需要用到LocalOverscrollConfiguration 解决的话,我抽空看下OverscrollConfiguration 的默认配置。

按照之前的步骤是不行的,复现方式只有快速下滑,然后快速上滑,多次尝试肯定能复现无法下拉。这个很多app都有这个问题,不单是UltraSwipeRefresh。套上CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { }可以解决这个问题。

按照之前的步骤是不行的,复现方式只有快速下滑,然后快速上滑,多次尝试肯定能复现无法下拉。这个很多app都有这个问题,不单是UltraSwipeRefresh。套上CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { }可以解决这个问题。

我抽空看下OverscrollConfiguration相关源码,找下具体原因,加上 CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { } 能解决是因为直接把传递到内部的 OverscrollConfiguration 相关的配置直接给干掉了。

按照之前的步骤是不行的,复现方式只有快速下滑,然后快速上滑,多次尝试肯定能复现无法下拉。这个很多app都有这个问题,不单是UltraSwipeRefresh。套上CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { }可以解决这个问题。

我抽空看下OverscrollConfiguration相关源码,找下具体原因,加上 CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { } 能解决是因为直接把传递到内部的 OverscrollConfiguration 相关的配置直接给干掉了。

看了下源码的大概流程,目前得出如下结论:

  1. 通过:Modifier.overscroll(overscrollEffect) 来禁用这种边界过渡滚动效果理论上是可行的;
  2. 也找到了使用 CompositionLocalProvider(LocalOverscrollConfiguration provides null) { } 能解决边界滚动的关键点:AndroidOverscroll.android.kt#L67;(方式2更彻底)

至于最后怎么处理,还需等我先复现并验证此问题后,再看是否有必要内置方式2。

按照之前的步骤是不行的,复现方式只有快速下滑,然后快速上滑,多次尝试肯定能复现无法下拉。这个很多app都有这个问题,不单是UltraSwipeRefresh。套上CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { }可以解决这个问题。

我抽空看下OverscrollConfiguration相关源码,找下具体原因,加上 CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { } 能解决是因为直接把传递到内部的 OverscrollConfiguration 相关的配置直接给干掉了。

看了下源码的大概流程,目前得出如下结论:

  1. 通过:Modifier.overscroll(overscrollEffect) 来禁用这种边界过渡滚动效果理论上是可行的;
  2. 也找到了使用 CompositionLocalProvider(LocalOverscrollConfiguration provides null) { } 能解决边界滚动的关键点:AndroidOverscroll.android.kt#L67;(方式2更彻底)

至于最后怎么处理,还需等我先复现并验证此问题后,再看是否有必要内置方式2。

  1. 昨天抽空测试了下,按照后面说的这样操作,无法复现;
  2. 麻烦帮测试下:如果使用默认的SwipeRefreshHeader 是否有同样的问题?(对应的示例:SwipeRefreshIndicatorSample

我这边是可以很容易复现,你手机是不是比较老,可能新手机比较容易复现。每一种下拉都可以很容易复现,包括SwipeRefreshIndicatorSample。我拍个视频你看看

可以100%复现

675_1718073391.mp4
676_1718073529.mp4

重新录了一个有声音的

我这边是可以很容易复现,你手机是不是比较老,可能新手机比较容易复现。每一种下拉都可以很容易复现,包括SwipeRefreshIndicatorSample。我拍个视频你看看

那换成使用google的SwipeRefresh是否存在同样的问题呢?

我这边是可以很容易复现,你手机是不是比较老,可能新手机比较容易复现。每一种下拉都可以很容易复现,包括SwipeRefreshIndicatorSample。我拍个视频你看看

那换成使用google的SwipeRefresh是否存在同样的问题呢?

优化了一些细节,并补充了关于google的SwipeRefresh示例;可以下载 演示App 测下 UltraSwipeRefresh 和 google的SwipeRefresh示例是否都存在此问题?

我这边是可以很容易复现,你手机是不是比较老,可能新手机比较容易复现。每一种下拉都可以很容易复现,包括SwipeRefreshIndicatorSample。我拍个视频你看看

那换成使用google的SwipeRefresh是否存在同样的问题呢?

优化了一些细节,并补充了关于google的SwipeRefresh示例;可以下载 演示App 测下 UltraSwipeRefresh 和 google的SwipeRefresh示例是否都存在此问题?

google的SwipeRefresh已测试,有同样的问题。看视频。

692_1718542399.mp4

我这边是可以很容易复现,你手机是不是比较老,可能新手机比较容易复现。每一种下拉都可以很容易复现,包括SwipeRefreshIndicatorSample。我拍个视频你看看

那换成使用google的SwipeRefresh是否存在同样的问题呢?

优化了一些细节,并补充了关于google的SwipeRefresh示例;可以下载 演示App 测下 UltraSwipeRefresh 和 google的SwipeRefresh示例是否都存在此问题?

google的SwipeRefresh已测试,有同样的问题。看视频。

692_1718542399.mp4

好的,既然如此,那我抽空改下:向OverscrollConfiguration妥协了;

这里附上 SwipeRefresh的对应Issue#1059记录下,便于后续查看;虽是已关闭状态,但并未真正解决。

SwipeRefresh的对应Issuehttps://github.com/google/accompanist/issues/1059记录下
SwipeRefresh这个居然设置了30天无人讨论自动关闭,这不是不想改bug吗

SwipeRefresh的对应Issuehttps://github.com/google/accompanist/issues/1059记录下 SwipeRefresh这个居然设置了30天无人讨论自动关闭,这不是不想改bug吗

存在即合理。

已修改,如需验证,可下载 演示App;如需提前使用,可参见:待发布版本