山海万灵 HarmonyOS 文化知识实战(16):发现记录与探索位置的 Preferences 持久化
一、把发现进度保存成可恢复的事实在山海万灵的离线浏览链路里读者会连续完成图鉴发现、区域切换和展厅浏览。应用重启后仍需回到同一段探索而不是重新从一张空白图鉴开始。持久化层保存的对象因此不是页面快照而是一组能够重新计算界面的最小事实已发现神兽 ID、当前区域、当前展厅、数据版本和更新时间。interface ShanhaiLocalProgress { schemaVersion: number discoveredIds: string[] selectedRegionId: string selectedHallId: string updatedAt: number }这组字段都由用户动作直接产生。区域百分比、展厅进度和护照印章则由图鉴目录与发现 ID 在读取阶段计算得到。这样能把输入事实和显示结果分开管理。二、Preferences 的读写边界Preferences 存储使用固定名称保存同一份本地进度。写入时分别落下版本、发现 ID、区域、展厅和更新时间最后再执行一次刷新读取时将字符串恢复为领域对象再交给状态层校验。async function save(progress: ShanhaiLocalProgress): Promisevoid { await preferences.put(schema_version, progress.schemaVersion) await preferences.put(discovered_ids, JSON.stringify(progress.discoveredIds)) await preferences.put(selected_region_id, progress.selectedRegionId) await preferences.put(selected_hall_id, progress.selectedHallId) await preferences.put(updated_at, progress.updatedAt) await preferences.flush() }这里避免把每一张卡片的显示状态逐项写入。卡片是否已发现、某区域收录了几只神兽都应由统一目录和 discoveredIds 推导当目录内容更新时旧数据也不会把过期的百分比继续带回界面。存储结构保持很小也让清除进度、版本迁移和异常恢复都能围绕同一个领域对象进行而不用遍历每个页面组件。三、恢复时先校验再计算恢复过程先处理版本和未知 ID再修正已经不在目录中的区域、展厅选择最后生成首页、区域页和护照页需要的状态。任何一个历史 ID 找不到对应神兽时都会被过滤避免内容更新后出现无法打开的详情入口。恢复阶段输入输出数据清洗存储中的版本与发现 ID可识别、去重后的发现集合位置修正区域与展厅选择仍存在的默认探索位置进度派生目录和发现集合区域、展厅进度与护照印章const discoveredCount region.beastIds .filter((id: string) discoveredIds.includes(id)).length const progress region.beastIds.length 0 ? 0 : Math.round(discoveredCount * 100 / region.beastIds.length)护照印章使用同一套集合判断一个区域内的神兽全部已在发现集合中才派生出该区域的印章。百分比和印章没有独立写入点因此不会出现一边已完成、另一边仍停在旧值的分叉。四、发现动作必须幂等详情页可能被重复进入发现动作不能因为重复点击就多次追加同一个 ID。写入前先判断集合中是否存在该神兽已经存在时保留原集合只记住用户当前浏览的区域与展厅。首次发现才扩展集合并立即保存。const nextIds progress.discoveredIds.includes(beastId) ? progress.discoveredIds : [...progress.discoveredIds, beastId] await repository.save({ ...progress, discoveredIds: nextIds, selectedRegionId: regionId, selectedHallId: hallId, updatedAt: Date.now() })单独切换探索位置时逻辑只替换区域、展厅和更新时间原有发现记录保持不变。这使我看到过什么和我上次停在哪里成为两个可以独立变化、但始终一起恢复的状态。async function load(): PromiseShanhaiLocalProgress { const schemaVersion Number(await preferences.get(schema_version, 1)) const rawIds String(await preferences.get(discovered_ids, [])) const selectedRegionId String(await preferences.get(selected_region_id, )) const selectedHallId String(await preferences.get(selected_hall_id, )) const updatedAt Number(await preferences.get(updated_at, 0)) let discoveredIds: string[] [] try { discoveredIds JSON.parse(rawIds) } catch (_) { discoveredIds [] } return { schemaVersion, discoveredIds: Array.from(new Set(discoveredIds)), selectedRegionId, selectedHallId, updatedAt } }读取逻辑把可能损坏的 JSON、重复 ID 和已经不存在的目录项看作独立问题。先保证返回对象具有稳定形状再把目录相关的过滤交给状态层完成。这样本地存储层不需要知道区域页面如何排版状态层也不需要关心键值读写的细节。五、重启后的恢复结果已记录的发现结果和探索位置在强停重启后会从本地存储恢复并重新生成首页上的发现计数与护照信息。下图展示了恢复后的本地进度界面它用于说明重启后的记录回读不把多次详情交互得到的数量变化归因于一次点击。六、失败不阻断本次探索本地读取失败时应用以空进度继续提供离线内容写入失败时本次进程中的发现状态仍可继续使用但下一次启动不会承诺恢复。这个边界让界面有明确的降级语义浏览和发现不因一次本地写入异常中断跨重启恢复则以成功写入为前提。对于读者而言页面不会把一次短暂的存储异常伪装成已经保存成功也不会因为离线资料仍然可用就阻断接下来的探索。情况当前行为下次启动读取失败以空进度加载本地内容等待下一次可读的恢复机会写入失败保留进程内发现状态不保证已变更内容能够恢复历史 ID 失效过滤失效 ID 并重算进度使用清洗后的有效集合七、验收关注点验收这条链路时应连续完成一次发现和一次区域或展厅切换再结束进程并重新进入。恢复后的计数、探索位置和护照信息应来自同一组本地事实重复发现同一神兽不应增加记录数量删除或失效的目录项不应把旧选择带回界面。若后续加入账号同步仍可沿用这一最小事实模型云端只合并发现集合与位置偏好区域进度和护照展示继续由本地目录派生从而避免把不同设备上的展示缓存当成可合并的业务数据。八、为版本演进留下收口本地记录需要显式携带版本号原因并不在于今天的字段已经复杂而在于图鉴内容、区域划分和默认探索位置都会继续演进。读取旧版本时可以为缺少的字段提供默认值遇到无法识别的版本时则返回安全的空进度并保留当前目录作为唯一展示依据。升级逻辑只处理数据形状不直接修改页面状态能够减少迁移代码和界面渲染相互牵连的风险。版本收口还让测试重点更清晰旧记录能否正常打开、重复 ID 是否收敛、失效选择是否替换为默认位置、升级后的新写入是否带上最新版本。它们分别覆盖历史兼容、数据一致性、导航恢复和后续可维护性。即使存储文件被用户清除应用也应把这视为一份新的空进度而不是把不完整内容解释为已完成的探索记录。function normalize(progress: ShanhaiLocalProgress): ShanhaiLocalProgress { const version progress.schemaVersion || 1 const ids Array.from(new Set(progress.discoveredIds || [])) return { schemaVersion: version, discoveredIds: ids, selectedRegionId: progress.selectedRegionId || , selectedHallId: progress.selectedHallId || , updatedAt: progress.updatedAt || 0 } } function emptyProgress(): ShanhaiLocalProgress { return { schemaVersion: 1, discoveredIds: [], selectedRegionId: , selectedHallId: , updatedAt: 0 } }这套边界也适用于后续增加更多图鉴条目时的持续维护。Preferences 的键值持久化、刷新语义和使用限制可参阅 HarmonyOS Preferences 数据持久化文档。

相关新闻

3分钟掌握!暗黑破坏神2终极存档编辑器d2s-editor完全指南

3分钟掌握!暗黑破坏神2终极存档编辑器d2s-editor完全指南

3分钟掌握!暗黑破坏神2终极存档编辑器d2s-editor完全指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 想要完全掌控你的暗黑破坏神2游戏体验吗?d2s-editor是一款强大的免费开源暗黑破坏神2存档编辑器&…

2026/8/6 14:22:00 阅读更多 →
山海万灵 HarmonyOS 文化知识设计续篇(14):2in1 设备键鼠交互补齐方案

山海万灵 HarmonyOS 文化知识设计续篇(14):2in1 设备键鼠交互补齐方案

在 2in1 宽屏窗口里,触摸、鼠标和键盘会交替出现。山海万灵的卡片、筛选和详情入口需要把“看见焦点”“暂时悬停”“真正选中”分开处理,才能让鼠标点击、Enter 和 Space 进入同一条业务命令。本篇给出键鼠交互补齐的设计方案,范围覆盖输入状…

2026/8/6 14:22:00 阅读更多 →
生命涌现的小龙虾技能之【Reptile Shedding Progress Analysis | 爬宠蜕皮进度识别】简介

生命涌现的小龙虾技能之【Reptile Shedding Progress Analysis | 爬宠蜕皮进度识别】简介

🦎 Reptile Shedding Progress Analysis | 爬宠蜕皮进度识别 智能分析中枢 图片/视频智能分析 结构化报告 历史报告云端查询 🧭 技能概览 | Overview 模块内容🏷️ 技能名称爬宠蜕皮进度识别🎯 核心目标通过爬宠箱固定摄像头&…

2026/8/6 14:22:00 阅读更多 →

最新新闻

XML CDATA技术解析与应用实践指南

XML CDATA技术解析与应用实践指南

1. XML CDATA基础解析在XML文档处理过程中,CDATA(Character Data)区块是一个经常被开发者忽视却极为实用的语法结构。我第一次接触CDATA是在处理一个包含大量数学公式的文档时,当时发现常规的XML转义方式会让文档变得难以维护&…

2026/8/6 15:16:31 阅读更多 →
AMD Ryzen处理器深度调试:SMUDebugTool架构解析与实战指南

AMD Ryzen处理器深度调试:SMUDebugTool架构解析与实战指南

AMD Ryzen处理器深度调试:SMUDebugTool架构解析与实战指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…

2026/8/6 15:16:31 阅读更多 →
IntelliJ IDEA新版Git集成深度解析:从界面操作到高效协作实战

IntelliJ IDEA新版Git集成深度解析:从界面操作到高效协作实战

1. 从“版本控制”到“高效协作”:为什么我们需要重新认识IDEA中的Git 如果你是一名Java开发者,或者正在使用任何基于JVM的语言进行开发,那么IntelliJ IDEA(以下简称IDEA)大概率是你的主力武器。而Git,作为…

2026/8/6 15:16:31 阅读更多 →
生态协同再添新成果!国科环宇望获OS完成海光 C86-4G 3000 系列 CPU 兼容性认证

生态协同再添新成果!国科环宇望获OS完成海光 C86-4G 3000 系列 CPU 兼容性认证

近日,望获OS团队与海光信息技术股份有限公司完成联合适配测试,其自研望获操作系统 V3 与海光 C86-4G 3000 系列 CPU 正式兼容互认。国科环宇自主研发的望获操作系统,是一款主要面向商业航天、交通能源、工业控制等行业打造的嵌入式操作系统&a…

2026/8/6 15:16:31 阅读更多 →
智能教材下载助手:三步轻松获取国家中小学智慧教育平台电子课本

智能教材下载助手:三步轻松获取国家中小学智慧教育平台电子课本

智能教材下载助手:三步轻松获取国家中小学智慧教育平台电子课本 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 …

2026/8/6 15:16:31 阅读更多 →
腾讯元宝代码复制到 Word 后缩进乱?DS 随心转先保留结构再整理

腾讯元宝代码复制到 Word 后缩进乱?DS 随心转先保留结构再整理

一句话答案:腾讯元宝回答里的代码块复制到 Word 后出现缩进、换行或等宽字体错乱,通常是网页样式没有随复制内容保留下来;先保留 Markdown 或纯文本备份,再按代码块处理,批量整理时可用 DS 随心转导出。常见症状用腾讯…

2026/8/6 15:15:31 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →