fun NavController.logBackStack(tag: String? = null, previous: List? = null, logger: Logger): List { logger.run { val spacer = " " v(" ") v(" -------- -------- -------- -------- -------- -------- -------- --------") v(" ") i(" -------- -------- Backstack status ${tag ?: ""} -------- --------") v("Current entry: ${currentBackStackEntry?.logStr() ?: "null"}") v("Previous entry: ${previousBackStackEntry?.logStr() ?: "null"}") v(" ") i("Current Backstack:") backQueue.forEachIndexed { index, backstackEntry -> d(backstackEntry.logStr(indent = spacer + spacer, tag = "[$index]")) } d(" ") previous?.let { v(" ") i("Previous Backstack:") it.forEachIndexed { index, backstackEntry -> v(backstackEntry.logStr(indent = spacer + spacer, tag = "[$index]")) } } v(" ") i(" -------- -------- end -------- --------") v(" ") v(" -------- -------- -------- -------- -------- -------- -------- --------") v(" ") } return backQueue.toImmutableList() } fun NavBackStackEntry.logStr(indent: String = "", tag: String? = null): String { var s = "" + indent tag?.let { s += " $it " } s += ">> " + destination.logStr(indent) return s } fun NavDestination.logStr(indent: String = "", tag: String? = null): String { var s = "" + indent tag?.let { s += it } s += "[${this::class.simpleName}] : ${label ?: displayName} dest id $id" return s } suspend fun NavController.logBackStackChanges( logger: Logger = NavigationParams::class.inject().androidLogger(), ): Unit = withContext(Dispatchers.Main) { var counter = 0 var previous: List? = null with(logger) { i("Backstack-entry monitoring started...") launch { currentBackStackEntryFlow.collectLatest { d("Backstack entry delta (°$counter) >> ${it.logStr()}") previous = logBackStack("Monitoring (°$counter)", previous, logger) counter++ } } } }