问题 1:电脑端头像上传后,又莫名其妙变成默认头像
复现步骤
- Windows 端(v1.1.1)在"我的"页设置头像,显示正常
- 不做任何操作,几分钟内(60s 轮询间隔)或下次启动后,头像变回默认
期望 / 实际
- 期望:设置后一直保持,直至手动移除
- 实际:头像被静默清除,回退为默认头像
相关代码
lib/core/sync/sync_table_registry.dart:90-95:user_settings 的 applyRemote 把所有不是 Storage 对象路径(<uuid>/avatar.ext)的 avatar_path 值当作"已移除",直接删除本地 avatar_local_path 与 avatar_path:
if (value == null || !AvatarSync.isStoragePath(value)) {
await SettingsRepository.delete(avatar_local_path);
await SettingsRepository.delete(avatar_path);
return;
}
- v1.1.0 旧客户端的
pushUserSettings(git show 7e039be:lib/core/sync/sync_service.dart:190-202)会把设备本地文件路径(如 C:\Users\...\avatar.jpg)原样推上云。
- v1.1.1 的
pushUserSettings(sync_service.dart:261)已带"旧路径→上传 Storage"的迁移逻辑,但它不在启动时调用(仅 app_provider.dart:160/537 和上传成功后调用),云上遗留的旧路径行不会被自愈。
可能原因
升级/多端混跑场景的必现链路:v1.1.0 时代的设备(升级前的 Windows 本体、仍装旧 APK 的手机)往云 user_settings.avatar_path 推过本机路径;v1.1.1 设备每 60s 拉取时,把该行判为非法并清除本地头像——上传成功后也会被同一行反复打回默认。
建议方案
applyRemote 遇到非 Storage 路径值时应忽略并保留本地头像(旧本机路径对别的设备无意义但无害),仅在云端 DELETE 事件(applyDelete)或显式移除时才清除
- 启动 pull 后调用一次
pushUserSettings:若本地 avatar_path 仍是旧本机路径且文件存在,自动上传 Storage 并推送对象路径,完成自愈
- 确认手机已升级 v1.1.1(旧 APK 会持续把本机路径推回云端)
问题 2:手机端头像选择界面,照片不全
复现步骤
- 手机端"我的"→ 头像 → 从相册选择
- 弹出的照片选择器里只显示部分照片,找不到相册里其他的图
期望 / 实际
- 期望:能看到相册全部照片/全部相册目录
- 实际:只有最近照片或部分目录
相关代码 / 环境
lib/features/me/me_screen.dart:475:ImagePicker().pickImage(source: ImageSource.gallery, ...)
pubspec.yaml:40:image_picker: ^1.1.2(image_picker_android 在 Android 13+ 默认走系统 Photo Picker,无需存储权限)
android/app/src/main/AndroidManifest.xml:仅声明 INTERNET,无 READ_MEDIA_IMAGES/READ_EXTERNAL_STORAGE
可能原因
大概率不是缺运行时权限,而是 Android 13+ Photo Picker 的视图限制:默认只展示"最近"照片,云端照片(如 Google 相册未下载到本机的)与部分目录不显示;部分 OEM ROM 行为更受限。Android 12 及以下走 ACTION_GET_CONTENT,一般不受影响。
建议方案(按优先级)
- 首选:插件级改用传统选择器——
ImagePickerAndroid.useAndroidPhotoPicker = false(走 ACTION_GET_CONTENT 完整目录树,无需任何权限)
- 若保留 Photo Picker:在设置页引导用户点"相册/浏览"进入完整视图
- 仅当目标机 ≤12 且传统选择器仍显示不全时,才补
READ_MEDIA_IMAGES(13+)/READ_EXTERNAL_STORAGE(≤12)
需要补充的环境信息
手机品牌 / Android 版本(影响最终选型)
问题 1:电脑端头像上传后,又莫名其妙变成默认头像
复现步骤
期望 / 实际
相关代码
lib/core/sync/sync_table_registry.dart:90-95:user_settings 的applyRemote把所有不是 Storage 对象路径(<uuid>/avatar.ext)的avatar_path值当作"已移除",直接删除本地avatar_local_path与avatar_path:pushUserSettings(git show 7e039be:lib/core/sync/sync_service.dart:190-202)会把设备本地文件路径(如C:\Users\...\avatar.jpg)原样推上云。pushUserSettings(sync_service.dart:261)已带"旧路径→上传 Storage"的迁移逻辑,但它不在启动时调用(仅app_provider.dart:160/537和上传成功后调用),云上遗留的旧路径行不会被自愈。可能原因
升级/多端混跑场景的必现链路:v1.1.0 时代的设备(升级前的 Windows 本体、仍装旧 APK 的手机)往云
user_settings.avatar_path推过本机路径;v1.1.1 设备每 60s 拉取时,把该行判为非法并清除本地头像——上传成功后也会被同一行反复打回默认。建议方案
applyRemote遇到非 Storage 路径值时应忽略并保留本地头像(旧本机路径对别的设备无意义但无害),仅在云端 DELETE 事件(applyDelete)或显式移除时才清除pushUserSettings:若本地avatar_path仍是旧本机路径且文件存在,自动上传 Storage 并推送对象路径,完成自愈问题 2:手机端头像选择界面,照片不全
复现步骤
期望 / 实际
相关代码 / 环境
lib/features/me/me_screen.dart:475:ImagePicker().pickImage(source: ImageSource.gallery, ...)pubspec.yaml:40:image_picker: ^1.1.2(image_picker_android 在 Android 13+ 默认走系统 Photo Picker,无需存储权限)android/app/src/main/AndroidManifest.xml:仅声明INTERNET,无READ_MEDIA_IMAGES/READ_EXTERNAL_STORAGE可能原因
大概率不是缺运行时权限,而是 Android 13+ Photo Picker 的视图限制:默认只展示"最近"照片,云端照片(如 Google 相册未下载到本机的)与部分目录不显示;部分 OEM ROM 行为更受限。Android 12 及以下走
ACTION_GET_CONTENT,一般不受影响。建议方案(按优先级)
ImagePickerAndroid.useAndroidPhotoPicker = false(走ACTION_GET_CONTENT完整目录树,无需任何权限)READ_MEDIA_IMAGES(13+)/READ_EXTERNAL_STORAGE(≤12)需要补充的环境信息
手机品牌 / Android 版本(影响最终选型)