簡體   English   中英

Jetpack compose - 如何使用參數執行 popBackStack?

[英]Jetpack compose - How to do popBackStack with arguments?

我有這種情況,其中用戶單擊可組合A中的按鈕,然后從可組合B的列表中選擇一個項目,並從可組合C的列表中選擇另一個項目。

我的問題是當我從屏幕C中選擇一個項目時,我想使用我在B & C中選擇的任何內容導航回屏幕A。 但是當給出參數時,popBackStack 不起作用。

這是代碼,

navController.popBackStack(route = Screen.SelectPlan.route + "?regionId=${region.id}&operatorId=${operator.id}")

現在,我看到 popBackStack 確實采用了路由參數,但將其轉換為哈希碼以進行導航,而不是創建類似 Uri 的導航函數。

這確實是一個錯誤,它困擾了我很長時間。 經過長時間的研究和閱讀navigation源碼,我寫了自己的擴展函數NavController.popBackStack來解決這個問題。 這很棘手,但對我有用。 還要注意這個版本的擴展功能不支持inclusivesaveState選項(由於當前導航API的限制),所以在返回當前目的地時不能restoreState

import android.content.Intent
import androidx.navigation.NavController

fun NavController.popBackStack(route: String): Boolean {
    if (backQueue.isEmpty()) {
        return false
    }

    var found = false
    var popCount = 0
    val iterator = backQueue.reversed().iterator()
    while (iterator.hasNext()) {
        val entry = iterator.next()
        popCount++
        val intent = entry
            .arguments
            ?.get("android-support-nav:controller:deepLinkIntent") as Intent?
        if (intent?.data?.toString() == "android-app://androidx.navigation/$route") {
            found = true
            break
        }
    }

    if (found) {
        navigate(route) {
            while (popCount-- > 0) {
                popBackStack()
            }
        }
    }
    return found
}

試試把“/”代替?

 navController.popBackStack(route = Screen.SelectPlan.route + "/regionId=${region.id}&operatorId=${operator.id}")

我遇到了同樣的問題,剛剛為自己找到了解決方案。

當您導航到目的地時,使用如下參數:

val arg1 = "someValue"
val arg2 = "someOtherValue"
navController.navigate("Destination/$arg1/$arg2")

...這route存儲在新創建的 backstack 條目中,而不是那些 args 的,而是它們在NavHost中分配的名稱

假設我的NavHost包含一個帶有Destination/{arg1}/{arg2}路由的composable

如果執行我之前示例中的.navigate()調用,則會使用此路由Destination/{arg1}/{arg2}將條目添加到后台堆棧,而不是此路由Destination/someValue/someOtherValue

您沒有在帖子中提供您的NavHost ,但是如果您將調用.popBackStack()中的這些參數的值替換為您在NavHost中分配的名稱,它應該適合您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM