33 lines
2.3 KiB
Plaintext
33 lines
2.3 KiB
Plaintext
// 正常退出与多窗口卸载示例:同一 ExitText 出现在两窗,onUnmount 按出现位置分别调用。
|
|
// 退出先取消任务、关闭窗口,再进行允许的卸载回调;已停止 VM 的清理不能重新进入源代码。
|
|
// 在原生文字类型上增加共享日志,用来观察每个 Mount 的卸载通知。
|
|
class ExitText: TextBlock {
|
|
// 业务对象共享同一日志引用,Mount 参数区分每次出现;不为每个窗口复制一份 ExitText.log。
|
|
log: Object
|
|
// 每次真实卸载递增同一 log;普通重绘不调用,重复 shutdown 也不应重复调用。
|
|
// 宿主挂载生命周期在某出现实际卸载时调用,不由普通 draw/repaint 调用;当前方法不再创建窗口或新任务。
|
|
function onUnmount(self: ExitText, mount: Mount): Unit {
|
|
// 每次出现通知增加一次共享值,可在保留的另一个视图观察;本例不把 Mount 当作另一份业务状态。
|
|
self.log.increment()
|
|
}
|
|
}
|
|
// 全局持有日志,之后 watched 及 textOf 也引用它,关闭一个窗口不意味着日志立即失去业务所有者。
|
|
log = ui.state(0)
|
|
// 文字业务对象只创建一次,Page 与另一窗都引用它,但两边有各自的 Mount 生命周期。
|
|
watched = ExitText("关闭副窗口可观察卸载计数;退出应用也会卸载剩余位置",2,log)
|
|
// 主窗口 Page 持有组合根,watched 在组合中形成一次出现;另一页稍后再形成独立出现。
|
|
page = Page()
|
|
page.title = "退出生命周期"
|
|
page.render(Column(24,16,watched,ui.textOf(log,"value")))
|
|
// 创建同 VM 内的另一原生窗口;迁移 other 后仍保留 watched 的业务身份。
|
|
second = Window()
|
|
second.setTitle("Exit lifecycle secondary")
|
|
// 独立 Page 使用同一 watched 引用,挂到第二窗口时创建自己的 Mount 和卸载通知路径。
|
|
other = Page()
|
|
other.render(watched)
|
|
// 移动的是 Page 的窗口归属,watched 的共享对象身份保持;不创建第二个 VM 运行同一源码。
|
|
other.moveToWindow(second)
|
|
// 应用级长定时任务用于观察退出会取消尚未完成的工作,不让退出过程等满 30 秒。
|
|
// sleep 不带回调,返回可等待 Task;即使代码保存 pending,全局退出仍先取消任务而不等待计时结束。
|
|
pending = ui.sleep(ui,"pending",30000)
|