Jetpack Compose类型安全导航恢复回退栈崩溃问题求助
这个崩溃的核心是导航组件尝试恢复保存的回栈状态时,回栈中记录的某个目标页面(报错里的30355061)不存在于当前NavHost的导航图定义中,结合你的多模块架构和代码,具体原因可以分为以下几点:
跨模块导航的回栈状态冲突:你定义了
QrCodeScreenScanner、OtpScreen等多个Serializable页面类,但当前MenuActivity的NavHost只注册了MenuScreen、AskForNotificationPermissionScreen、UpdateNeededScreen三个页面。用户操作过程中必然跳转到了其他模块的导航图页面(比如扫码、OTP页面),当应用被系统后台回收后,系统保存了包含这些跨模块页面的回栈状态。当用户重新唤醒应用时,导航组件尝试恢复回栈,但当前MenuActivity的NavHost没有这些跨模块页面的destination定义,导致找不到目标报错。进程重启后的导航恢复时机问题:多模块架构下,其他模块的导航图可能在
MenuActivity初始化完成后才完成注册。当应用从后台回收状态重启时,导航组件会优先恢复保存的回栈状态,但此时跨模块的destination还未被添加到导航图中,导致无法找到目标。onNewIntent中的导航操作干扰回栈恢复:在onNewIntent中你调用了navigator.navigateTo(NavigatorRoute.ENROLMENT_COMPLETED),这个路由对应其他模块的页面。如果应用是从后台回收状态被这个intent唤醒,导航组件在恢复旧回栈的同时执行新的导航操作,两者冲突会触发回栈恢复失败。
另外,本地测试正常是因为本地测试时应用进程很少被系统回收,不会触发回栈恢复的场景;而线上用户的使用场景复杂,后台进程被回收的概率高,所以大量出现这个崩溃。
内容的提问来源于stack exchange,提问作者Rob

