[英]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
來解決這個問題。 這很棘手,但對我有用。 還要注意這個版本的擴展功能不支持inclusive
和saveState
選項(由於當前導航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.