feat: 主页账号备份,并修好 B50 预览缩不小

账号备份(AccountBackupCard + AccountBackupService):
- 并发读 GetUserData/Extend/Option/Rating/Charge/Activity/MissionData +
  Character + Map(分页)+ KaleidxScope + 各 itemKind 的 GetUserItemApi,
  汇成一个 JSON 字符串可复制到剪贴板。舞里程与总游玩数据本就在
  userData 的 point/totalPoint/playCount 里。
- itemKind 15(KaleidxScopeKey)不列进回读清单:客户端 ExportUserItems
  从不输出它,下行也没有读它的路径,钥匙实际是
  userKaleidxScopeList[].isKeyFound。
- 全程只发 GetUser*Api,不碰 UpsertUserAllApi。
- 逐段容错:私服没实现某个接口时其余照样备出,失败段单独列出——
  「读到但是空的」和「没读到」在 userItemList 里按 kind 分开存,可区分。
- 取数与拼装分开,buildBackupDocument/encode 部分是纯函数,单测覆盖。

B50 预览:原因是 InteractiveViewer(constrained:false) 给孩子无界约束,
FittedBox(fit: fitWidth) 在无界下根本不缩放,海报按 1762x1850 原尺寸铺开;
而 minScale 又算成 1.0,于是既巨大又缩不动。改为给一个 contain 尺寸的
有限盒子让 FittedBox 真正缩放,minScale 固定 1.0(这个版本没有
initialScale 可用)。RepaintBoundary 留在 FittedBox 内侧,绘制尺寸仍是
1762x1850,导出分辨率不受影响,并加了断言守住这点。
This commit is contained in:
Cookiues committed 2026-10-02 12:26:03 +08:00
1 parent a5fb2c97cd
commit 0cb5320290
8 files changed
+524 -36

No files matched your search

+17
View File
@@ -37,6 +37,23 @@ class AppStrings {
static const connectionShareEmpty = '当前会话既没有 Cookie 也没有令牌,无法导出。';
static const restoreSession = '恢复会话';
static const restoringSession = '恢复中...';
// 账号备份:把服务器可读到的用户数据汇成一个 JSON 字符串
static const accountBackupTitle = '账号备份';
static const accountBackupDesc =
'只读地把服务器上的用户数据汇成一串 JSON:道具清单、舞里程、游玩统计、'
'旅行伙伴、区域进度、万花筒进度、Rating 与成绩等。全程只发 GetUser* 接口,'
'不会写任何数据。';
static const accountBackupRun = '生成备份';
static String accountBackupRunning(String section) =>
section.isEmpty ? '备份中...' : '备份中:$section';
static const accountBackupCopy = '复制到剪贴板';
static const accountBackupCopied = '备份内容已复制到剪贴板';
static String accountBackupSize(String size) => '共 $size';
static String accountBackupPartial(List<String> failures) =>
'${failures.length} 段没读到(私服可能未实现该接口),其余照常:'
'${failures.join('、')}';
static const accountBackupSecurity = '备份含账号标识与进度数据;内容未加密,请勿贴到公开场合。';
static const sessionShareDetected = '已识别为连接信息(实验性功能),点击「恢复会话」直接续上这次登录。';
static const sessionRestoreFailed = '会话恢复失败';
static const sessionRestoreCookie =