FragmentHostCallback.getContext()空指针异常 导航组件deeplink跳转Fragment随机崩溃
崩溃原因
该空指针异常是Navigation Component低版本的已知时序问题:应用在后台被销毁后,通过deep link直接唤起目标Fragment时,Fragment的attach生命周期回调触发早于Fragment宿主的FragmentHostCallback初始化完成,导致调用getContext()时拿到空对象。
必现场景
- 应用进程处于后台被系统回收状态
- 从外部入口(通知、浏览器、桌面快捷方式等)触发deep link直接跳转目标Fragment
- 宿主Activity重建时,FragmentManager的pending导航任务执行时序早于宿主初始化完成
修复方案
方案1:升级依赖(优先选择)
该问题已在官方高版本依赖中修复,将以下依赖升级到对应版本及以上即可:
androidx.navigation:navigation-fragment-ktx:2.4.0androidx.fragment:fragment-ktx:1.4.0
方案2:临时兼容(无法升级依赖时使用)
在导航宿主对应的Activity的onCreate方法中,调整deep link的处理时序,等Activity完全初始化后再执行导航:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val navHost = supportFragmentManager.findFragmentById(R.id.nav_host) as NavHostFragment val navController = navHost.navController // 仅首次创建且有deep link数据时延迟处理 if (savedInstanceState == null && intent?.data != null) { // 等View绘制完成后再处理导航,保证宿主初始化完成 window.decorView.post { navController.handleDeepLink(intent) // 处理完成清空intent,避免屏幕旋转等场景重复触发 intent = null } } }
额外检查项
确认目标Fragment的onAttach、onCreate等早期生命周期方法中,没有直接调用requireContext()、requireActivity()的逻辑,这类调用可以移动到onViewCreated生命周期之后执行,或者添加空判断保护。
内容的提问来源于stack exchange,提问作者Rahul Rastogi
相关产品推荐
相关产品推荐

