You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:10:56