Files
photo-live/apps/mobile
浅念 ac37794d43 fix(app): path-precise duplicate matching; shared file stat; union test
Review follow-ups on 0fa23e0 (Task 2), applied as one commit:

- Path-precise dupPaths (#2, user-visible): DuplicateMatch gains
  sourcePath (local match fills it from the matched pick; unified
  server branch from picks[hit.index].path). Both pages' duplicate
  dialogs derive dupPaths from duplicates' sourcePath instead of
  basename matching, so same-basename siblings (different dir/bytes)
  are no longer mis-flagged — "跳过重复" no longer drops the
  non-duplicate sibling. Stale basename-derivation comment removed.
- Single shared stat (#3): files are stat'd once in
  checkDuplicatesUnified (_statPicks) and the picks feed both the
  local half (extracted _matchLocalHistory; public checkDuplicates
  folded — it had no remaining callers) and the server request.
  Halves stat IO for large batches (was ~2x).
- Union test (#1): new test/features/uploads/enqueue_test.dart pins
  that a file hit by BOTH local and server history yields ONE
  DuplicateMatch with the local uploadedAt (server's echoed time does
  not override). Merge dedup is now keyed by sourcePath
  (putIfAbsent, local first).

Tests: +1 enqueue union test (real-async chain inside one runAsync
window; sync file/dir setup — fake-async body must not await real
IO), +1 album_detail same-basename sibling test (skip-duplicates
enqueues exactly the non-hit sibling, distinguished by bytes since
sourceFilePath becomes the preparer's staging copy).

Gates: flutter analyze clean; full flutter test 429/429 green.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-28 20:22:37 +08:00
..

photo_live(工作人员 App)

P3 Flutter App(Android 优先;iOS 目录已生成但本机不编译,见计划 G3 关口)。

环境

工具链不在 PATH,所有 Flutter/Dart 命令先 source 仓库根的环境脚本(Git Bash):

source scripts/flutter-env.sh   # 仓库根执行;含 PATH/JAVA_HOME/ANDROID_HOME 与国内 pub 镜像

常用命令

cd apps/mobile
flutter pub get        # 依赖
flutter gen-l10n       # l10n 生成(arb 在 lib/l10n/,模板 app_zh.arb)
flutter analyze        # 静态检查(要求 0 issue)
flutter test           # 单测 / widget 测试
flutter build apk --debug   # 产物 build/app/outputs/flutter-apk/app-debug.apk

MuMu 模拟器联调:

adb connect 127.0.0.1:16384   # 失败再试 5555 / 7555 / 21503
adb devices
adb install -r build/app/outputs/flutter-apk/app-debug.apk
adb shell am start -n com.photolive.photo_live/.MainActivity

结构

  • lib/app/:根组件、主题(Material 3)、locale provider 脚手架(Task 10 完成切换)
  • lib/pages/:login / home(相册、队列、设置三个 tab 的桩页面)
  • lib/l10n/:arb 与生成的 app_localizations*.dart(zh 模板 + en)
  • Android:minSdk 24 / targetSdk 36;INTERNET 权限在 main manifest(debug+release 生效)
  • iOS:Info.plist 含本地网络 ATS 例外(联调宿主回环;Android 侧对应 10.0.2.2)与相册/相机用途说明(zh+en)

说明

  • sqlite3_flutter_libs 解析到 0.6.0+eol(官方弃用桩:sqlite3 3.x 起经 Dart 原生构建钩子自带 SQLite,无需该包);Task 5 建 drift schema 时在模拟器上验证实际打包行为。
  • turbo/pnpm 天然不纳入本目录(无 package.json);移动端命令以上述手动方式执行。