HarmonyOS 鸿蒙Next中EntryAbility,windowStage.loadContent(path,callback),path怎么传参呢?
HarmonyOS 鸿蒙Next中EntryAbility,windowStage.loadContent(path,callback),path怎么传参呢?
1、想模拟个登录页面跳转,如有有token则跳转至XX
页,如果没有token则跳转登录页。
2、声明了private
pageUrl = ''
,用于存储XX
页的URL
。
3、问题是windowStage.loadContent(path,callback),其中path好像接收不到参数,而且报401错误,不知何解了
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
let uiAbilityContext = this.context
let preferenceInstance = PreferencesManager.instance()
preferenceInstance.get(uiAbilityContext, 'token', (param: ValueType) => {
if (param) {
//登录成功,有token
this.pageUrl = 'pages/preferences/preferences'
console.log('登录成功88@88' + param + this.pageUrl)
} else {
//没登录,没有token
this.pageUrl = 'pages/preferences/login'
console.log('登录失败88@88' + param + this.pageUrl)
}
})
windowStage.loadContent(this.pageUrl, (err) => {
if (err.code) {
hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
return;
}
hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
});
}
更多关于HarmonyOS 鸿蒙Next中EntryAbility,windowStage.loadContent(path,callback),path怎么传参呢?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这种业务场景很常见,一般默认是加载index页(主页或者Home页),在主页进行路由拦截判断是否存在用户信息,一般存储在用户首选项里面,如果不存在则跳转到登录页面。
也就是说不要再UIAbility中进行业务处理,采用“路由拦截”的思路才是最优解。
-
windowStage.loadContent(‘pages/Index’, (err) => { if (err.code) { hilog.error(DOMAIN, ‘testTag’, ‘Failed to load the content. Cause: %{public}s’, JSON.stringify(err)); return; } hilog.info(DOMAIN, ‘testTag’, ‘Succeeded in loading the content.’); }); 以上代码不需要修改
-
使用HMRouter进行路由拦截: @HMInterceptor({ interceptorName: ‘PageInterceptor’ }) export class PageInterceptor implements IHMInterceptor { handle(info: HMInterceptorInfo): HMInterceptorAction { if (isLogin) { // 跳转下一个拦截器处理 return HMInterceptorAction.DO_NEXT; } else { HMRouterMgr.push({ pageUrl: ‘LoginPage’, param: { targetUrl: info.targetName }, skipAllInterceptor: true }) // 拦截结束,不再执行下一个拦截器,不再执行相关转场和路由栈操作 return HMInterceptorAction.DO_REJECT; } } }
更多关于HarmonyOS 鸿蒙Next中EntryAbility,windowStage.loadContent(path,callback),path怎么传参呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
export default class EntryAbility extends UIAbility {
private pageUrl = 'pages/preferences/preferences'
private loginPageUrl = 'pages/preferences/login'
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
let uiAbilityContext = this.context
let preferenceInstance = PreferencesManager.instance()
preferenceInstance.get(uiAbilityContext, 'token', (param: ValueType) => {
windowStage.loadContent(param ? this.pageUrl : this.loginPageUrl, (err) => {
if (err.code) {
hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
return;
}
hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
});
param ? console.log('登录成功88@88' + param + this.pageUrl) : console.log('登录失败88@88' + param + this.loginPageUrl)
})
}
}
这是时序问题,你把loadcontent放到首选项的get回调里,
谢谢,如果牵扯时序的话,那就完全搞不定了,也只能写get回调里了,就是看着有点不伦不类的。
真奇怪,也搞不懂了。
windowStage.loadContent(pageUrl,()=>{})
,我在这方法内打印pageUrl
,是空值。
但是在onWindowStageCreate
方法内打印,则有值,且也有string。
// 定义登录状态存储的key
private static readonly IS_LOGGED_IN_KEY = ‘isLoggedIn’
private prefs: preferences.Preferences | null = null
async onWindowStageCreate(windowStage: window.WindowStage) { try { // 1. 获取Preferences实例用于读取登录状态 this.prefs = await preferences.getPreferences(this.context, ‘userAuth’)
// 2. 检查登录状态(默认false)
const isLoggedIn = await this.prefs.get(EntryAbility.IS_LOGGED_IN_KEY, false)
// 3. 根据登录状态加载不同页面
if (isLoggedIn) {
// 已登录:进入主页面
windowStage
.loadContent('pages/Index', (err) => {
if (err) console.error('加载主页面失败', err)
})
} else {
// 未登录:跳转到登录页
windowStage
.loadContent('pages/Login', (err) => {
if (err) console.error('加载登录页失败', err)
})
}
} catch (error) { console.error(‘登录验证失败’, error) // 失败时加载默认页 windowStage .loadContent(‘pages/Index’, () => {}) } }
这样试一下,没有验证
感谢指点,逻辑没问题,总感觉写2个windowStage.loadContent()
怪怪的。
先跑通了在讲,ble也是有好多问题,先跑起来在慢慢修改,
刚我跑了下,两个windowStage.loadContent(),没问题。
在HarmonyOS Next中,EntryAbility
的windowStage.loadContent()
方法path
参数应传入页面路径字符串。路径格式为:“pages/[pageName]”,其中pageName
对应resources/base/profile/main_pages.json
中定义的页面名。例如:“pages/index”。
callback
参数为可选异步回调函数,类型为(err: Error) => void
。若加载成功err
为null
,失败则返回错误对象。
完整调用示例:
windowStage.loadContent("pages/index", (err) => {
if (err) console.error(err);
});
在HarmonyOS Next中,windowStage.loadContent()
的path参数是直接接收页面路径字符串的。从你的代码看,问题出在异步逻辑处理上:
-
preferenceInstance.get()
是异步操作,但loadContent()
在回调完成前就执行了,此时pageUrl
还是初始值’’ -
401错误通常表示路径无效,因为异步未完成时路径为空
正确做法是将loadContent()
移到preference回调内部:
onWindowStageCreate(windowStage: window.WindowStage): void {
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
let uiAbilityContext = this.context
let preferenceInstance = PreferencesManager.instance()
preferenceInstance.get(uiAbilityContext, 'token', (param: ValueType) => {
let targetPath = param ? 'pages/preferences/preferences' : 'pages/preferences/login';
console.log('跳转路径: ' + targetPath);
windowStage.loadContent(targetPath, (err) => {
if (err.code) {
hilog.error(DOMAIN, 'testTag', '加载失败: %{public}s', JSON.stringify(err));
return;
}
hilog.info(DOMAIN, 'testTag', '加载成功');
});
});
}
关键点:
- 确保
loadContent
在异步回调中执行 - 直接使用局部变量而非类属性存储路径
- 路径字符串需与工程中实际页面路径完全匹配(注意大小写)