引入navigation庫后潜必,在bugly上發(fā)現(xiàn)會有少量崩潰與之相關(guān)
java.lang.IllegalArgumentException
navigation destination com.mistong.kklonline.kklonline:id/action_nav_to_detail is unknown to this NavController
com.mistong.kklonline.exam.homework.AnswerCardFragment.d(AnswerCardFragment.kt:204)
查看NavController的源碼,發(fā)現(xiàn)出錯原因在這個節(jié)點不存在導(dǎo)致,node是null,而且navAction也是null
NavDestination node = findDestination(destId);
if (node == null) {
final String dest = NavDestination.getDisplayName(mContext, destId);
throw new IllegalArgumentException("navigation destination " + dest
+ (navAction != null
? " referenced from action " + NavDestination.getDisplayName(mContext, resId)
: "")
+ " is unknown to this NavController");
}
看調(diào)用的地方胃榕,只是常規(guī)的調(diào)用方式就乓,應(yīng)該不會有太大問題
navigationControl?.navigate(R.id.action_nav_to_detail)
這個錯比較偶現(xiàn)烹吵,憑直覺應(yīng)該是重復(fù)點擊引起的惧眠。普通點擊還沒有辦法重現(xiàn)打颤,我用monkey模擬下瘋狂點擊暴拄。發(fā)現(xiàn)了問題所在:
navigation的currentNode已經(jīng)到了下一個節(jié)點漓滔。
image.png
而currentNode是從mBackStack中取出的,而mBackStack在navigation這個函數(shù)調(diào)用之后就已經(jīng)改變了乖篷,所以當重復(fù)調(diào)用的時候肯定會出問題响驴。
避坑總結(jié)
navigationControl庫在重復(fù)點擊情況下可能會引起崩潰, 要么做下重復(fù)點擊過濾撕蔼,要么捕獲可能拋出的異常