应用Resume事件路由导航报错:Cannot read property navigate of undefined
解决Nativescript Resume事件中RouterExtensions导航报错的问题
你遇到的核心问题是回调函数的上下文丢失,导致注入的RouterExtensions实例无法被正确访问,所以才会出现“Cannot read property navigate of undefined”的错误。下面给你详细的原因分析和修复方案:
错误原因
你在resumeEvent里使用了普通的function作为回调,这种情况下回调内部的this指向的是事件触发的上下文(而非你的组件实例),因此构造函数中注入的routerExtensions自然就变成了undefined。
修复方案
有两种简单的方式可以解决这个问题:
方案1:使用箭头函数绑定组件上下文
箭头函数会继承外层的this上下文(也就是你的组件实例),这样就能正常访问到注入的RouterExtensions了:
// 先确保构造函数正确注入RouterExtensions constructor(private routerExtensions: RouterExtensions) { super(); // 其他初始化逻辑 } eventInitialization(): void { applicationOn(resumeEvent, (args: ApplicationEventData) => { // 替换为箭头函数 if (args.android) { const act = args.android; const intent = act.getIntent(); const extras = intent.getExtras(); if (extras) { // 替换成你的指定变量判断逻辑 const targetVar = extras.getString("your_target_variable_key"); if (targetVar) { // 导航到特定页面,路径请根据你的路由配置修改 this.routerExtensions.navigate(["/your-target-page"], { clearHistory: true // 可选:需要清除历史栈时添加 }); } } } }); }
方案2:提前保存组件实例的引用
如果必须使用普通function作为回调,可以在回调外先把组件的this保存到一个变量中(比如that),再在回调里用这个变量访问routerExtensions:
eventInitialization(): void { const that = this; // 保存组件实例的引用 applicationOn(resumeEvent, function (args: ApplicationEventData) { if (args.android) { const act = args.android; const intent = act.getIntent(); const extras = intent.getExtras(); if (extras) { const targetVar = extras.getString("your_target_variable_key"); if (targetVar) { that.routerExtensions.navigate(["/your-target-page"]); } } } }); }
额外注意:避免内存泄漏
为防止组件销毁后事件监听仍存在导致内存泄漏,建议在组件的销毁生命周期中移除这个事件监听。可以把回调函数保存为组件属性,然后在对应钩子中移除:
private resumeListener: (args: ApplicationEventData) => void; eventInitialization(): void { this.resumeListener = (args: ApplicationEventData) => { // 你的导航逻辑 }; applicationOn(resumeEvent, this.resumeListener); } ngOnDestroy(): void { // 移除事件监听 applicationOff(resumeEvent, this.resumeListener); }
内容的提问来源于stack exchange,提问作者Kerby82
相关产品推荐
相关产品推荐

