refactor(ui): 重构UI路由基础功能

- 移除Show方法中基于实例的显示功能,简化接口设计
- 改进Hide方法实现,支持永久销毁和临时隐藏两种模式
- 添加Resume方法用于恢复已隐藏的UI界面
- 更新XML文档注释,提供更清晰的参数说明
- 优化代码结构和注释,提升代码可读性
- 调整IUiRouter接口定义,保持API一致性
- [release ci]
This commit is contained in:
GeWuYou 2026-02-06 23:14:51 +08:00
parent 89227ff802
commit f1e45385c4
2 changed files with 42 additions and 45 deletions

View File

@ -147,29 +147,27 @@ public interface IUiRouter : ISystem
UiLayer layer, UiLayer layer,
IUiPageEnterParam? param = null); IUiPageEnterParam? param = null);
/// <summary>
/// 在指定层级显示UIOverlay / Modal / Toast等
/// </summary>
/// <param name="page">要显示的UI页面行为对象</param>
/// <param name="layer">UI显示的层级例如 Overlay、Modal 或 Toast</param>
/// <param name="param">传递给UI页面的初始化数据</param>
/// <param name="enter">是否立即进入UI页面默认为 false</param>
void Show(
IUiPageBehavior page,
UiLayer layer,
IUiPageEnterParam? param,
bool enter = false);
/// <summary> /// <summary>
/// 在指定层级显示UI基于已存在实例 /// 在指定层级显示UI基于已存在实例
/// </summary> /// </summary>
void Show(IUiPageBehavior page, UiLayer layer); void Show(IUiPageBehavior page, UiLayer layer);
/// <summary> /// <summary>
/// 隐藏指定层级的UI /// 隐藏指定层级的UI。
/// </summary> /// </summary>
/// <param name="uiKey">要隐藏的UI的唯一标识符。</param>
/// <param name="layer">指定UI所在的层级。</param>
/// <param name="destroy">是否销毁UI对象默认为false表示仅隐藏而不销毁。</param>
void Hide(string uiKey, UiLayer layer, bool destroy = false); void Hide(string uiKey, UiLayer layer, bool destroy = false);
/// <summary>
/// 恢复指定层级的UI显示。
/// </summary>
/// <param name="uiKey">要恢复显示的UI的唯一标识符。</param>
/// <param name="layer">指定UI所在的层级。</param>
void Resume(string uiKey, UiLayer layer);
/// <summary> /// <summary>
/// 清空指定层级的所有UI /// 清空指定层级的所有UI
/// </summary> /// </summary>

View File

@ -518,47 +518,24 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
} }
/// <summary> /// <summary>
/// 在指定层级显示UI基于实例 /// 隐藏指定层级的UI。
/// </summary>
public void Show(
IUiPageBehavior page,
UiLayer layer,
IUiPageEnterParam? param,
bool enter = false)
{
if (layer == UiLayer.Page)
throw new ArgumentException("Use Push() for Page layer");
var uiKey = page.Key;
if (!_layers.ContainsKey(layer))
_layers[layer] = new Dictionary<string, IUiPageBehavior>();
_layers[layer][uiKey] = page;
_uiRoot.AddUiPage(page, layer);
if (enter)
page.OnEnter(param);
page.OnShow();
Log.Debug("Show existing UI instance in layer: {0}, layer={1}", uiKey, layer);
}
/// <summary>
/// 隐藏指定层级的UI
/// </summary> /// </summary>
/// <param name="uiKey">要隐藏的UI的唯一标识符。</param>
/// <param name="layer">UI所在的层级。</param>
/// <param name="destroy">是否永久销毁UI。如果为true则UI将被彻底移除如果为false则UI仅被隐藏可后续恢复。</param>
public void Hide(string uiKey, UiLayer layer, bool destroy = false) public void Hide(string uiKey, UiLayer layer, bool destroy = false)
{ {
// 尝试获取指定层级的UI字典若不存在则直接返回
if (!_layers.TryGetValue(layer, out var layerDict)) if (!_layers.TryGetValue(layer, out var layerDict))
return; return;
// 尝试获取指定UI键对应的页面对象若不存在则直接返回
if (!layerDict.TryGetValue(uiKey, out var page)) if (!layerDict.TryGetValue(uiKey, out var page))
return; return;
if (destroy) if (destroy)
{ {
// 永久移除 // 永久移除UI调用OnExit方法并从UI根节点和层级字典中移除该UI
page.OnExit(); // ✅ 只在 Destroy 时 Exit page.OnExit(); // ✅ 只在 Destroy 时 Exit
_uiRoot.RemoveUiPage(page); _uiRoot.RemoveUiPage(page);
layerDict.Remove(uiKey); layerDict.Remove(uiKey);
@ -570,7 +547,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
} }
else else
{ {
// 临时隐藏(可恢复) // 临时隐藏UI调用OnHide方法保留UI状态以便后续恢复
page.OnHide(); // ✅ Hide ≠ Exit page.OnHide(); // ✅ Hide ≠ Exit
Log.Debug( Log.Debug(
@ -580,6 +557,28 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter
} }
} }
/// <summary>
/// 恢复指定层级中已隐藏的UI。
/// </summary>
/// <param name="uiKey">要恢复的UI的唯一标识符。</param>
/// <param name="layer">UI所在的层级。</param>
public void Resume(string uiKey, UiLayer layer)
{
// 尝试获取指定层级的UI字典若不存在则直接返回
if (!_layers.TryGetValue(layer, out var layerDict))
return;
// 尝试获取指定UI键对应的页面对象若不存在则直接返回
if (!layerDict.TryGetValue(uiKey, out var page))
return;
// 调用OnShow和OnResume方法以恢复UI的显示和状态
page.OnShow();
page.OnResume();
Log.Debug("Resume UI in layer: {0}, layer={1}", uiKey, layer);
}
/// <summary> /// <summary>
/// 清空指定层级的所有UI /// 清空指定层级的所有UI
/// </summary> /// </summary>