一、鴻蒙應用開發中,HAR(靜態共享包)和HSP(動態共享包)間的頁面跳轉,有着不同的路徑配置規則和依賴管理方式。
|
特性
|
HAR(靜態共享包)
|
HSP(動態共享包)
|
|
核心跳轉方式 |
命名路由 ( |
完整Bundle路徑 ( |
|
路徑格式 |
路由名 (如 |
|
|
前置配置 |
在HAR頁面使用 |
確保HSP模塊已正確配置並隨主包部署
|
|
適用場景 |
依賴關係清晰、需要避免循環依賴的模塊間跳轉
|
需要運行時動態加載、模塊獨立性要求高的場景
|
二、HAR包頁面跳轉
HAR包的頁面跳轉主要依賴命名路由。
- 配置HAR頁面:在HAR包中,跳轉的頁面組件使用
@Entry({routeName: '路由名'})進行裝飾。
// 在HAR包的頁面文件中
@Entry({ routeName: 'StaticPage' }) // 定義命名路由
@Component
export struct StaticPage {
// 頁面代碼
}
2. 跳轉到HAR頁面:在需要跳轉的地方,使用router.pushNamedRoute()方法,並指定在HAR中定義的路由名
import router from '@ohos.router';
//導入頁面文件
import "library_static/src/main/ets/components/StaticPage" //靜態導入
//import('library_static/src/main/ets/components/StaticPage') //也可以動態導入
// 在Entry或Feature模塊中跳轉
router.pushNamedRoute({
name: 'StaticPage', // 與HAR中定義的路由名一致
params: { key: 'value' } // 可選參數
})
備註:HAR包頁面不能直接使用pushUrl跳轉,必須採用命名路由方式
三、HSP包頁面跳轉
HSP包的頁面跳轉則必須使用完整的Bundle路徑。
- 跳轉到HSP頁面:使用
router.pushUrl()方法,其中url參數需嚴格按照'@bundle:包名(bundleName)/模塊名(moduleName)/路徑/頁面所在的文件名(不加.ets後綴)'的格式編寫
import router from '@ohos.router';
// 從Entry或Feature模塊跳轉到HSP頁面
const bundleName = (getContext(this) as common.UIAbilityContext).applicationInfo.name;
router.pushUrl({
url: `@bundle:${bundleName}/library/ets/pages/SharedPage` // 完整的Bundle路徑
}).then(() => {
// 跳轉成功回調
}).catch(err => {
// 跳轉失敗處理
console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
})
注意:HSP中的頁面同樣需要使用@Entry裝飾器,不需要routeName參數(其實也可以按照命名路由方式跳轉)。
HSP內的相互跳轉及返回
- HSP跳轉到HSP:同樣使用上述的完整Bundle路徑格式。
- HSP內返回:使用
router.back()。如果需要返回到特定的HAP頁面,url可以寫為'pages/Index'這樣的相對路徑;如果返回HSP頁面,則需要使用完整的Bundle路徑。
總結
|
特性
|
HAR 包跳轉
|
HSP 包跳轉
|
|
依賴時機 |
編譯時依賴
|
運行時依賴
|
|
是否需要導入 |
必須導入目標頁面 |
無需導入目標頁面 |
|
跳轉方式 |
|
|
|
路徑配置 |
使用路由名稱
|
使用完整Bundle路徑
|
|
類型安全 |
編譯時類型檢查
|
運行時解析,無編譯時類型檢查
|
|
耦合度 |
緊耦合(編譯時需要)
|
鬆耦合(運行時解析)
|
建議:
- 簡單跳轉推薦命名路由方案,代碼更簡潔
- route頁面棧最大容量為32個頁面,超出需要調用
clear()方法清理 - 需要複雜頁面棧管理時推薦Navigation方案
- 若涉及多HAP跳轉,建議改用HSP動態共享包