我有一个FirebaseMessagingService子类,它接收通知负载,然后创建一个具有以下挂起内容的推送通知:

        TaskStackBuilder.create(this).run {
            addNextIntentWithParentStack(
                Intent(
                    Intent.ACTION_VIEW,
                    "eway://traversals_monthly_bill_details".toUri()
                )
            )
            getPendingIntent(2345, PendingIntent.FLAG_UPDATE_CURRENT)
        }

以下是我们导航的各个嵌套图的组合:

    composable(Screens.INTERMEDIATE_MONTHLY_BILLINGS.navRoute,
        deepLinks =
        listOf(
            navDeepLink {
                uriPattern =
                    "eway://traversals_monthly_bill_details"
            }
        )) {
        IntermediateMonthlyBillings({ statements ->
            val lastIndex = statements.lastIndex
            val gson = GsonBuilder().create()
            val statementsByYearJson = gson.toJson(statements)
            navController.navigate("${Screens.MONTHLY_BILLINGS}/$statementsByYearJson/$lastIndex")
        })
    }
    composable("${Screens.MONTHLY_BILLINGS.navRoute}/{statementsByYear}/{initialIndex}",
        arguments = listOf(
            navArgument("statementsByYear") {},
            navArgument("initialIndex") {
                type = NavType.IntType
            }
        )
    ) {
        val gson = GsonBuilder().create()
        val statementsByYear = gson.fromJson(
            it.arguments?.getString("statementsByYear"),
            AllStatementsByYear::class.java
        )
        MonthlyBillings(statementsByYear, it.arguments?.getInt("initialIndex")!!)
        updateCurrentScreen(Screens.MONTHLY_BILLINGS)
    }

这是中间屏幕:

@Composable
fun IntermediateMonthlyBillings(
    onDataAcquired: (AllStatementsByYear) -> Unit,
    myEwayLoggedInViewModel: MyEwayLoggedInViewModel = get()
) {
    val statementsByYear by myEwayLoggedInViewModel.statementsByYear.observeAsState(null)

    if (statementsByYear == null) {
        GenericLoader(type = MyLoaderType.LIGHT_BACKGROUND)
    }
    LaunchedEffect(statementsByYear == null) {
        if (statementsByYear != null) {
            onDataAcquired(statementsByYear!!)
        }
    }
}

问题是,虽然深度链接可以工作,我被导航到中间屏幕,并在收到数据后运行回调onDataAcquired(然后将我导航到MonthlyBillings屏幕),但它看起来似乎充满了MonthlyBillings或中间屏幕的实例,我不知道为什么.

在我到达deeplink的目的地后,我需要发送"后退"按钮的垃圾邮件,在大约10次try 后,它将开始将我导航回原始堆栈.

我实际上想要的是,堆栈只有最终的目标屏幕(MonthlyBillings)以及一系列Backback条目,如果用户手动导航(例如ScreenA、ScreenC、ScreenF、MonthlyBillings).

推荐答案

在NavGraph的中间composable个目的地内记录后队列目的地路由后,如下所示:

 composable(Screens.INTERMEDIATE_MONTHLY_BILLINGS.navRoute,
        deepLinks =
        listOf(
            navDeepLink {
                uriPattern =
                    "eway://traversals_monthly_bill_details"
            }
        )) {
        Log.d("PAYMENTSGRAPH", "composable called with backstack ${navController.backQueue}")
        navController.backQueue.forEach {
            Log.d("PAYMENTSGRAPH", it.destination.route.toString())
        }
        IntermediateMonthlyBillings({ statements ->
            Log.d("CALLBACK_PAYMENTSGRAPH", "callback called")
            val lastIndex = statements.lastIndex
            val gson = GsonBuilder().create()
            val statementsByYearJson = gson.toJson(statements)navController.navigate("${Screens.MONTHLY_BILLINGS}/$statementsByYearJson/$lastIndex")
        })
    }

每当我打开深度链接时,我注意到以下输出:

2022-07-05 11:24:27.802 16304-16304/[修订]

然后我意识到,由于D/PAYMENTSGRAPH: intermediate_monthly_billings目的地仍然在堆栈中,在从monthly_billings/{statementsByYear}/{initialIndex}目的地导航回来后,中间屏幕中的逻辑将再次运行,因此它正在为monthly_billings屏幕重新创建NavBackbackEntry,并将我导航回那里.如果我把后退按钮发得足够快,我就可以"超越"娱乐,因此有时它可以"工作".

在从回调中导航到monthly_billings屏幕之前,修复是一个简单的navController.popBackStack().以下是最终代码:

    composable(Screens.INTERMEDIATE_MONTHLY_BILLINGS.navRoute,
        deepLinks =
        listOf(
            navDeepLink {
                uriPattern =
                    "eway://traversals_monthly_bill_details"
            }
        )) {
        IntermediateMonthlyBillings({ statements ->
            val lastIndex = statements.lastIndex
            val gson = GsonBuilder().create()
            val statementsByYearJson = gson.toJson(statements)
            navController.popBackStack()
            navController.navigate("${Screens.MONTHLY_BILLINGS}/$statementsByYearJson/$lastIndex")
        })
    }

Android相关问答推荐

在Android应用程序上使用Room数据库时,是否可以预先填充数据

房间DB:UPSERT返回什么?

Jetpack Compose-如何使用值动画直接控制其他动画

从安卓S原生库的资源中读取json文件

在Jetpack Compose中实现焦点突出的最佳方式?

LaunchedEffect没有延迟时应用程序崩溃

警告:应用必须面向 Android 13(API 级别 33)或更高版本.确实如此

React-Native Manifest 合并失败并出现多个错误

Android WebView 不会在滚动端加载新内容

使用 settings.gradle 文件将 Firebase 依赖项添加到 Android 项目

如何在 React Native 下载文件之前打开文件管理器并 Select 一个目录

在 Jetpack Compose 中使用 .observeAsState() 时,如何在更改 MutableLiveData 的值后开始执行一段代码?

如何在jetpack compose中通过lamda返回columnScope/RowScope

验证硬编码密码

无法通过 retrofit 解析对 kotlin 数据类的 xml 响应

清洁架构中的服务

如何在 react native 应用程序中显示复选框?当它在 android 模拟器中可见时

房间实时数据:启动时崩溃

Android Compose webview 被拉伸

我的自定义视图没有显示我应该如何修复它?