v0.8.4 简要卡观感 / 分享 / 名册搜索 / 全局返回手势(v59e)
八条需求的落地与真因: 1. 浮层与白底"糊在一起"、看不清 —— 根因不是配色,是**遮罩从来没画出来过**: ArkUI 的八位色值是 #AARRGGBB(alpha 在前),而全应用写的是 '#00000066' (本意"黑 40%")⇒ alpha = 0x00 ⇒ 全透明。同型还有 brand + '1A'(拼到了蓝通道) 与 shadow('#00000033')。⇒ 17 个文件统一改走 fbAlpha() / FB_MASK / FB_SHADOW / FB_HAIRLINE;真机像素采样复验:遮罩 (148,146,140)、卡片白、浅底 (237,242,243)。 2. 简要卡外圈加**主题色描边环**(外层铺色 + padding,不是 border —— border 会被 内层圆角切出白缝)。 3. 简要卡**去掉删除按钮**,删除挪到完整详情卡最下面(Divider + 红字块)。 顺手修一处静默失败:confirmDelete() 原来只取 quickSource(), 从家谱直接开详情时 quickPerson 为 null ⇒ 点删除毫无反应。 4. 信息行间距 10 → 16(每行再各加 3vp 上下内边距,实测行距 134/118px)。 5. 主电话整行可点**直接拨号**(call.makeCall,落到系统拨号盘)。 6. 按钮改为 详情 / 编辑 / 分享 / 关闭;分享走系统分享面板, 内容为纯文本「姓名 / 电话 / 邮箱」三项(用户点名的就是这三项, 不多带单位),面板拉不起来时兜底复制到剪贴板并提示。 7. 名册搜索"完全不能用"有两个独立真因: ① 搜索框是 List 的第一个 item,无结果时整个 List 被空态替换 ⇒ 输入框被卸载、 焦点丢失 ⇒ 输不进第二个字。改:List 无条件渲染,空态自身做成 ListItem。 ② rowToPerson 把 initials 写死成空串,服务端下发的拼音首字母从未落库 ⇒ 拼音搜索恒 0 结果。改:FB_DB_VERSION 6→7 + PRAGMA 探测补列 + 同步时落库; 匹配同时遍历全部电话(原来只比主号)。 另加搜索框「清空」(24×24 命中区)。 8. 全局返回手势:应用是单页 + 模块分发、没有路由栈 ⇒ 自建 FB_BACK 登记表 (倒序询问)+ moduleHistory + applyModule()(不记历史,否则 A/B 两页来回弹)。 9 个页面登记/注销;Index.onBackPress 先关浮层 → 回上一模块 → 才 return false 交给系统退桌面(onBackPress 必须声明 boolean,返回 void 会被当成没接管)。 验证: - 静态守卫 417 / 0(新增 ⑤阴影·描边·色环 ⑥透明度色 ⑦返回手势 ⑧搜索 ⑨分享) - 反向验证 10 / 0(9 条注入全部能让守卫变红;其中"遮罩换纯黑"那条暴露了 一条存在型假绿,已改成数个数 + 禁止 Color.Black) - 建表/迁移列一致性守卫 12 / 0 - 真机全模块遍历 14 / 14;真机逐项复核 12 / 0 与 7 / 0 工具侧顺带修好两个过期的探针: - 遍历探针仍用"应用内横滑"打开抽屉,而该手势早已按用户要求去掉、入口改为顶栏图标 ⇒ 一次全量遍历里 12 个模块全报"抽屉里没找到"(像应用坏了,其实是探针过期)。 - 资源/笔记两页写死了早已不存在的条目(户口本/房产证/阳台改造清单)⇒ 改成 结构性文案(副标题 + 常驻筛选胶囊),不随用户数据变化而恒红。
This commit is contained in:
@@ -43,6 +43,7 @@ import { FbDb } from '../data/FbDb';
|
||||
import { FB_ATTACH } from '../data/FbAttachQueue';
|
||||
import { FB_KEY_STORE } from '../data/FbKeyStore';
|
||||
import { fbSyncState } from '../common/FbSyncStore';
|
||||
import { FB_BACK } from '../common/FbBack';
|
||||
import { common } from '@kit.AbilityKit';
|
||||
|
||||
/**
|
||||
@@ -97,6 +98,48 @@ struct Index {
|
||||
FB_GRIP.stop();
|
||||
}
|
||||
|
||||
/**
|
||||
* 🔴🔴 v59e(用户 2026-10-18):接管**系统返回手势**。
|
||||
*
|
||||
* 用户原话:
|
||||
* 「加入全局返回按键手势,现在在界面中使用系统的返回手势,是返回到桌面了,
|
||||
* 这样不好,如果有弹框,返回应该是关闭弹窗,或者返回上个页面,
|
||||
* 如果要退出 app,用户可以选择返回桌面的手势。在应用中给,
|
||||
* 应该是返回上一层才对。」
|
||||
*
|
||||
* 为什么以前会"直接回桌面":本应用**没有实现 `onBackPress`** ⇒
|
||||
* 系统认为这一页没有消费返回 ⇒ 按默认行为**把应用退到后台**。
|
||||
* 而本应用是"单页 + 模块分发",系统并不知道"用户其实还在应用里"。
|
||||
*
|
||||
* 处理顺序(从**最上面一层**往下):
|
||||
* ① 抽屉开着 ⇒ 收抽屉(它是最外层的浮层);
|
||||
* ② 页面内浮层(详情 / 编辑 / 简要卡 / 设置 …)⇒ 由页面自己关,
|
||||
* 见 `common/FbBack.ets` 的登记表;
|
||||
* ③ 不在首页 ⇒ 回上一个模块(没有历史就回首页);
|
||||
* ④ 首页且没有任何浮层 ⇒ **返回 false**,交还给系统
|
||||
* (用户想退到桌面时,退回桌面仍是他的手势说了算)。
|
||||
*
|
||||
* ⚠️ 返回值语义:`true` = **已消费**(不再往下传);`false` = 交给系统处理。
|
||||
* 这里必须显式写 `: boolean`,返回 `void` 会被当成 false ⇒ 等于没接管。
|
||||
*/
|
||||
onBackPress(): boolean {
|
||||
// ① 抽屉
|
||||
if (this.app.drawerOpen) {
|
||||
this.app.drawerOpen = false;
|
||||
return true;
|
||||
}
|
||||
// ② 页面内浮层(登记表里最后登记的先问 —— 见 common/FbBack.ets)
|
||||
if (FB_BACK.back()) {
|
||||
return true;
|
||||
}
|
||||
// ③ 回上一个模块 / 回首页
|
||||
if (this.entered && !this.app.needLogin && this.app.backToPrevModule()) {
|
||||
return true;
|
||||
}
|
||||
// ④ 真的在最外层了:让系统退到桌面
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 读状态栏高度(由 `EntryAbility` 在全屏生效后量好、放进 AppStorage)。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user