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

11 回复

这种业务场景很常见,一般默认是加载index页(主页或者Home页),在主页进行路由拦截判断是否存在用户信息,一般存储在用户首选项里面,如果不存在则跳转到登录页面。

也就是说不要再UIAbility中进行业务处理,采用“路由拦截”的思路才是最优解。

  1. 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.’); }); 以上代码不需要修改

  2. 使用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中,EntryAbilitywindowStage.loadContent()方法path参数应传入页面路径字符串。路径格式为:“pages/[pageName]”,其中pageName对应resources/base/profile/main_pages.json中定义的页面名。例如:“pages/index”。

callback参数为可选异步回调函数,类型为(err: Error) => void。若加载成功errnull,失败则返回错误对象。

完整调用示例:

windowStage.loadContent("pages/index", (err) => {
    if (err) console.error(err);
});

在HarmonyOS Next中,windowStage.loadContent()的path参数是直接接收页面路径字符串的。从你的代码看,问题出在异步逻辑处理上:

  1. preferenceInstance.get()是异步操作,但loadContent()在回调完成前就执行了,此时pageUrl还是初始值’’

  2. 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', '加载成功');
    });
  });
}

关键点:

  1. 确保loadContent在异步回调中执行
  2. 直接使用局部变量而非类属性存储路径
  3. 路径字符串需与工程中实际页面路径完全匹配(注意大小写)
回到顶部