从鸿蒙理财模板看页面状态:部分清理、重新加载与七项合成测试
给已有的理财产品详情页增加“风险说明”入口,看上去只是多一个按钮和一段文案。读完页面与 ViewModel 后,我更关心返回详情时的状态:当前产品、自选状态、收益图时间范围分别由谁保存,又会在什么时候重新加载?
这次我阅读了鸿蒙金融理财应用模板的三个 ArkTS 文件,并在华为云 AI 开发者空间的免费体验环境中完成一个 Python 标准库练习。源码分析关注字段赋值和调用关系;练习使用独立合成数据展示两种清理策略。本次没有构建 HAP,也没有在鸿蒙设备上验证生命周期、界面渲染或接口时序。
1. 从页面找到状态对象
本次阅读的是 HarmonyOS-APPTMPL-FinancialManagement(https://gitcode.com/harmony-practice-center/HarmonyOS-APPTMPL-FinancialManagement),查看时间为 2026 年 11 月 10 日。重点是以下三个文件,仓库文件可能随后更新,复查时应核对对应版本。
- ProductInfo.ets(https://gitcode.com/harmony-practice-center/HarmonyOS-APPTMPL-FinancialManagement/blob/main/scenes/product/src/main/ets/pages/ProductInfo.ets):组合产品介绍、交易流程、收益、历史业绩、购买与赎回规则、产品档案等组件。
- ProductInfoVM.ets(https://gitcode.com/harmony-practice-center/HarmonyOS-APPTMPL-FinancialManagement/blob/main/scenes/product/src/main/ets/viewModels/ProductInfoVM.ets):保存产品数据、图表数据和选择状态,查询资料后更新字段。
- ProductIntroduction.ets(https://gitcode.com/harmony-practice-center/HarmonyOS-APPTMPL-FinancialManagement/blob/main/scenes/product/src/main/ets/components/productInfo/ProductIntroduction.ets):读取名称、收益展示字段、起购金额和风险文字。
ProductIntroduction 的风险标签读取 this.vm.productInfo.risk。新增说明时,首先要确保说明内容与当前产品匹配,而不是另放一份容易失去关联的文字。
2. 显示、隐藏与重新请求
ProductInfoVM 通过静态实例提供状态对象。ProductInfo 显示时调用 vm.init(),隐藏时调用 vm.clear()。因此,字段的初始声明并不能说明每次打开详情时的最终状态,还要继续检查这两个方法。
init() 取得 PRODUCT_INFO 的路由参数,在参数有效时请求产品详情、购买规则、赎回规则、交易流程、历史业绩、自选状态、年化收益数据与产品档案。年化数据查询会使用已有的选择索引:
this.getAnnualizedDataset(param, dateButton[this.annualizedSelectedIndex].value)
在这个调用点,时间范围取自 annualizedSelectedIndex。是否应该保留上一次选择,要由交互需求决定;实际返回流程还需要结合图表组件和设备操作确认。
3. clear() 的赋值范围
下面只描述 clear() 方法内部是否重置字段,不代表其他方法不会更新它们。
| 字段 | clear() 内的处理 | 复查重点 |
|---|---|---|
| productInfo、购买规则、赎回规则、交易流程 | 产品信息恢复初始对象,规则与流程置为 undefined | 加载期间的展示 |
| productHistoricalPerformance | 清空数组 | 空数据展示 |
| isAccountInformationEmpty、isSelected、isLogin | 置为 false | 后续重新赋值 |
| currentIndex、selectedIndex、annualizedSelectedIndex、revenueSelectedIndex | 该方法未重置 | 是否保留用户选择 |
| xData、seriesData、productProfile | 该方法未重置 | 新数据到达前后的更新 |
仅凭“没有清空某个字段”不能判定界面存在故障。保留时间范围可能正是预期行为;同时,产品切换时是否短暂显示旧数据,也需要运行验证。源码阅读在这里提供的是待检查的具体状态路径。
4. 在 AI 开发者空间写一个四字段模型
为了把赋值范围看得更清楚,我在免费体验环境的 /root/workspace/product-state-demo 中创建了 demo.py、test_demo.py 和 README.md。全部使用 Python 标准库与合成数据,没有请求业务接口,也没有执行 ArkTS。
模型只留下产品标识、自选状态、年化时间索引和横轴数据四个字段。product_id 是合成模型自行定义的字段,清零也只是模型约定,并非照搬原始 productInfo 对象。核心实现如下,省略了输出辅助函数:
from dataclasses import dataclass, field
@dataclass
class ProductState:
product_id: int = 0
is_selected: bool = False
annualized_index: int = 0
x_data: list = field(default_factory=list)
def partial_clear(self) -> None:
self.product_id = 0
self.is_selected = False
def reset_for_new_product(self) -> None:
self.product_id = 0
self.is_selected = False
self.annualized_index = 0
self.x_data = []
default_factory=list 为每个新实例建立独立列表。这里的两个实例仅用于检查 Python 模型的默认值行为;原始 ProductInfoVM 使用单例,两者的对象生命周期不能直接等同。
partial_clear 只清空产品标识与自选状态。reset_for_new_product 则展示一种“所有字段回到初始值”的备选策略。选哪一种要看需求,完整重置也可能使用户每次返回都丢失自己选择的时间范围。
5. 实际运行结果与七项检查
在这个云端体验容器中执行 python3 --version,输出为 Python 3.11.16,退出码为 0。执行 python3 -m unittest -v,得到:
Ran 7 tests in 0.000s
OK
exit_code=0
七项检查覆盖:清空产品标识与自选状态、保留年化索引、保留横轴数组、重复部分清理、四字段完整重置、实例列表互不共享,以及部分清理后绑定另一产品仍保留旧索引。0.000s 是测试框架的格式化输出,不作为性能结论。
随后执行 python3 demo.py。从产品 101 的合成状态开始,依次部分清理、把 product_id 赋为 202、完整重置,原始输出如下:
before: {"product_id": 101, "is_selected": true, "annualized_index": 2, "x_data": ["day1", "day2"]}
partial_clear: {"product_id": 0, "is_selected": false, "annualized_index": 2, "x_data": ["day1", "day2"]}
rebind_202: {"product_id": 202, "is_selected": false, "annualized_index": 2, "x_data": ["day1", "day2"]}
full_reset: {"product_id": 0, "is_selected": false, "annualized_index": 0, "x_data": []}
exit_code=0
这段输出直接展示:改变产品标识不会自动改变另一个字段。部分清理后,索引 2 与 day1、day2 仍保留;完整重置后,它们才回到 0 和空列表。示例没有网络、渲染或导航机制,也没有模拟原应用的 init()。
这七项测试证明的是本合成模型的行为。我没有由此认定原模板存在可见故障,也没有验证原应用在快慢请求交错、返回页面或切换产品时的最终界面。
6. 新增风险说明时怎么继续验证
下一步应先写明交互预期:同一产品从风险说明返回时是否保留时间范围;打开另一产品时是否重置图表选择;重新加载期间展示占位、旧内容还是加载提示。预期明确后,再调整字段的生命周期。
实际工程中可按以下顺序检查。这些是后续验证计划,本次尚未执行:
- 在产品 A 选择一个非默认时间范围,打开风险说明再返回,核对产品 id、风险文字、时间选择与自选状态。
- 从 A 返回列表并打开产品 B,检查数据、档案和收益图是否属于 B,以及选择范围是否符合事先约定。
- 在慢请求、失败或空数据场景检查过渡状态,记录请求参数、响应与页面回调的先后顺序,再判断是否需要重置字段或处理过期响应。
- 回归已有购买与持仓演示入口,确认新增说明没有改变原导航参数和返回路径。真实交易仍需要独立的服务端校验与业务验收。
这次阅读的收获是把“页面状态”拆成可以逐项核对的字段与赋值点。一个 clear() 方法清理多少、哪些选择值得保留,都应该对应明确的交互需求;小型合成测试可以帮助解释策略差异,工程结论仍需回到原始应用验证。
- 点赞
- 收藏
- 关注作者
评论(0)