flutter_wechat_assets_picker
flutter_wechat_assets_picker copied to clipboard
[BUG] Android设备加载相册时会在recent页面一直loading无法加载
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]
写清楚版本。
wechat_assets_picker: ^9.1.0
能否给个邮箱可发送视频附件给你,现在无法上传附件
已发送邮件,请帮忙查看,其他功能都是正常的,而且想问下这个recent等目录可以展示为中文吗?
在iPad上面我也复现了这个问题,iPad上面有2个目录,一个最近项目,一个截屏(30),刚进来显示最近项目图片能成功加载出来,切换到截屏目录下,再切回最近项目就一直loading,此时最近项目没显示具体数量,iPad (第8代),17.5.1系统,已给予全部照片访问权限
不是每次打开相册都必现,但是app重启后第一次去打开相册出现问题概率较大,出现的场景或者规律就是recent或者最近项目不显示具体数量,切到其他目录再切回时复现,且不退出重新进入的话无法解决这个问题
未复现,可以自行打断点排查执行情况
未复现,可以自行打断点排查执行情况
必现的问题,第一次运行demo,从常用选择进去,第一个展示的列表是recent的列表,但是recent未显示具体数量,此时列表能加载出来,切换到其他目录再切回recent时无法加载,通过断点查看,assetCount为0,如果此时退出选择器,第二次进来时recent显示数量,切换也正常
Android 和iOS均能复现,推测是第一次初始化的问题,但是内部逻辑复杂,不方便去逐个调试解决
经过反复调试,问题出现在AssetPickerProvider类中的getThumbnailFromPath方法的path调用copyWith方法的赋值中导致assetCount丢失被错误还原为null,导致后续显示错误
copyWith 不应该会造成这个问题,除非 copy 前就已经为空了。前几天刚好有调整相册计数的相关代码,可以看下 #605 有没有修复问题。
copyWith 不应该会造成这个问题,除非 copy 前就已经为空了。前几天刚好有调整相册计数的相关代码,可以看下 #605 有没有修复问题。
我这边在main分支上面看不到你说的最新的代码,还是等后续有版本更新再试吧,可能是循环异步操作导致某些属性未被赋值,我这边测试我修改的代码是能解决问题的,loading就是因为没获取到assetCount,导致进入了显示loading的逻辑
在尝试完善某个功能是发现了这个问题,问题出在 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。
但是 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 会变化时先取到目前的即可。
8.9.0-dev1 , 安卓14,
https://github.com/user-attachments/assets/0467f302-67a9-4b78-87b1-cbc2b0745db7
什么时间能解决这个问题呢?相册加载优化的代码什么时候发布,我看现在的最新版本还是之前发布的9.1.0
在 #605 中修复。
在 #605 中修复。
恩,今天试了最新的代码,确实已经修复了
在#605中修复。
你好,修复版本什么时候发布呢?