flutter_wechat_assets_picker icon indicating copy to clipboard operation
flutter_wechat_assets_picker copied to clipboard

[BUG] Android设备加载相册时会在recent页面一直loading无法加载

Open hjr19911126 opened this issue 1 year ago • 8 comments

Describe the bug 首次进入相册选择图片,最开始是recent目录下的图片,切换到别的目录(例如camera),此时camera能显示具体图片总数,但是recent不显示,从camera切回recent时一直loading加载无法显示图片,退出相册,第二次进来时recent显示具体图片数量时,也就不存在上述问题。 从demo工程和我们自己的app集成插件均会出现上述情况,机型有鸿蒙4.2设备及Android 14荣耀设备

Expected behavior 期望能解决loading不显示的问题

Screenshots (If contains) 有相关录屏,传附件

Version information

  • Device: [华为 p40Pro、荣耀9Pro平板]
  • OS: [鸿蒙4.2、Android 14]
  • Package Version: [9.1.0]
  • Flutter Version: [3.19.6]

hjr19911126 avatar Jul 05 '24 03:07 hjr19911126

写清楚版本。

AlexV525 avatar Jul 05 '24 03:07 AlexV525

wechat_assets_picker: ^9.1.0

hjr19911126 avatar Jul 05 '24 03:07 hjr19911126

能否给个邮箱可发送视频附件给你,现在无法上传附件

hjr19911126 avatar Jul 05 '24 03:07 hjr19911126

已发送邮件,请帮忙查看,其他功能都是正常的,而且想问下这个recent等目录可以展示为中文吗?

hjr19911126 avatar Jul 05 '24 03:07 hjr19911126

在iPad上面我也复现了这个问题,iPad上面有2个目录,一个最近项目,一个截屏(30),刚进来显示最近项目图片能成功加载出来,切换到截屏目录下,再切回最近项目就一直loading,此时最近项目没显示具体数量,iPad (第8代),17.5.1系统,已给予全部照片访问权限

hjr19911126 avatar Jul 05 '24 03:07 hjr19911126

不是每次打开相册都必现,但是app重启后第一次去打开相册出现问题概率较大,出现的场景或者规律就是recent或者最近项目不显示具体数量,切到其他目录再切回时复现,且不退出重新进入的话无法解决这个问题

hjr19911126 avatar Jul 05 '24 03:07 hjr19911126

未复现,可以自行打断点排查执行情况

AlexV525 avatar Jul 05 '24 10:07 AlexV525

未复现,可以自行打断点排查执行情况

必现的问题,第一次运行demo,从常用选择进去,第一个展示的列表是recent的列表,但是recent未显示具体数量,此时列表能加载出来,切换到其他目录再切回recent时无法加载,通过断点查看,assetCount为0,如果此时退出选择器,第二次进来时recent显示数量,切换也正常 debug-info

hjr19911126 avatar Jul 16 '24 07:07 hjr19911126

Android 和iOS均能复现,推测是第一次初始化的问题,但是内部逻辑复杂,不方便去逐个调试解决

hjr19911126 avatar Jul 16 '24 07:07 hjr19911126

经过反复调试,问题出现在AssetPickerProvider类中的getThumbnailFromPath方法的path调用copyWith方法的赋值中导致assetCount丢失被错误还原为null,导致后续显示错误 fix

hjr19911126 avatar Jul 16 '24 09:07 hjr19911126

copyWith 不应该会造成这个问题,除非 copy 前就已经为空了。前几天刚好有调整相册计数的相关代码,可以看下 #605 有没有修复问题。

AlexV525 avatar Jul 16 '24 11:07 AlexV525

copyWith 不应该会造成这个问题,除非 copy 前就已经为空了。前几天刚好有调整相册计数的相关代码,可以看下 #605 有没有修复问题。

我这边在main分支上面看不到你说的最新的代码,还是等后续有版本更新再试吧,可能是循环异步操作导致某些属性未被赋值,我这边测试我修改的代码是能解决问题的,loading就是因为没获取到assetCount,导致进入了显示loading的逻辑

hjr19911126 avatar Jul 17 '24 02:07 hjr19911126

在尝试完善某个功能是发现了这个问题,问题出在 DefaultAssetPickerProvider().getPaths():

    // Use sync method to avoid unnecessary wait.
    _paths
      ..forEach(getAssetCountFromPath)
      ..forEach(getThumbnailFromPath);

但是 getAssetCountFromPath 和 getThumbnailFromPath 包含异步代码,DefaultAssetPickerProvider 初始化时连续调用了两个 getPaths,存在 "线程安全" 问题。


{
    Singleton.sortPathDelegate = sortPathDelegate ?? SortPathDelegate.common;
    // Call [getAssetList] with route duration when constructing.
    Future<void>.delayed(initializeDelayDuration, () async {
      await getPaths(onlyAll: true);
      await getPaths(onlyAll: false);
    });
  }

建议将 forEach 优化为:

    for (final element in _paths) {
      await getAssetCountFromPath(element);
      await getThumbnailFromPath(element);
    }

建议将两个 getPaths 优化为 (onlyAll true 似乎有助于提高首屏加载速度,那可以考虑保留,我在测试一下):

 await getPaths(onlyAll: false);
 await getAssetsFromCurrentPath();

我正在优化有限权限时可选资源的刷新问题,稍后可能会会提 PR。

xkeyC avatar Jul 22 '24 07:07 xkeyC

但是 getAssetCountFromPath 和 getThumbnailFromPath 包含异步代码,DefaultAssetPickerProvider 初始化时连续调用了两个 getPaths,存在 "线程安全" 问题。


{
    Singleton.sortPathDelegate = sortPathDelegate ?? SortPathDelegate.common;
    // Call [getAssetList] with route duration when constructing.
    Future<void>.delayed(initializeDelayDuration, () async {
      await getPaths(onlyAll: true);
      await getPaths(onlyAll: false);
    });
  }

这里不相关

建议将 forEach 优化为:

    for (final element in _paths) {
      await getAssetCountFromPath(element);
      await getThumbnailFromPath(element);
    }

变成全等待会影响出现速度,界面无所谓这两步的等待

建议将两个 getPaths 优化为 (onlyAll true 似乎有助于提高首屏加载速度,那可以考虑保留,我在测试一下):

 await getPaths(onlyAll: false);
 await getAssetsFromCurrentPath();

这里需要用两个,改成其他的会引入新的问题

要解决这个 issue,只需要在两个 assetCount 会变化时先取到目前的即可。

AlexV525 avatar Jul 22 '24 07:07 AlexV525

8.9.0-dev1 , 安卓14,

https://github.com/user-attachments/assets/0467f302-67a9-4b78-87b1-cbc2b0745db7

demoYang avatar Jul 24 '24 07:07 demoYang

什么时间能解决这个问题呢?相册加载优化的代码什么时候发布,我看现在的最新版本还是之前发布的9.1.0

hjr19911126 avatar Jul 29 '24 09:07 hjr19911126

在 #605 中修复。

AlexV525 avatar Jul 29 '24 15:07 AlexV525

在 #605 中修复。

恩,今天试了最新的代码,确实已经修复了

hjr19911126 avatar Jul 30 '24 02:07 hjr19911126

在#605中修复。

你好,修复版本什么时候发布呢?

LWFLBB avatar Jul 31 '24 08:07 LWFLBB