簡體   English   中英

在 Jetpack Compose 中使用 NavHostFragment

[英]Use NavHostFragment in Jetpack Compose

我們有一個舊版應用程序,我們開始遷移到 Jetpack Compose。 該應用程序只有一個活動,使用帶有導航 XML 圖的導航組件在片段之間導航。

我們正在遵循這種方法:

  • 一次遷移一個片段
  • 為每個片段制作一個@Composable 屏幕,提供與片段相同的 UI
  • 從片段 onCreateView() 將內容設置為新創建的屏幕

現在,假設我們有 Fragment1 包含一些導航到 Fragment2 的操作。 在原始代碼中,我們將在 Fragment1 中調用以下代碼:

NavHostFragment.findNavController(this).navigate(directionToFragment2)

當創建一個可組合來替換 Fragment1 UI 時,我們如何實現從這個可組合到 Fragment2 的導航? 在可組合中,我們可以調用:

val navController = rememberNavController()

但這似乎是與片段使用的導航不同的導航 controller。 有沒有辦法從可組合訪問與片段使用的導航相同的導航 controller?

我們目前看到的唯一替代方法是將 Fragment 的導航 controller 作為參數傳遞給可組合對象,但它看起來不太正確。

您是正確的,您不能使用rememberNavController() - 這將創建一個全新的嵌套NavController僅適用於可組合目的地。

根據測試指南,強烈建議避免在您的任何可組合組件(即HomeScreen可組合組件)中直接引用任何NavController 相反,建議傳入一個 lambda ,您的可組合組件可以在它想要導航時觸發。

然后,您的 Fragment(在ComposeView上調用setContent的那個)將負責實現該 lambda 並調用NavHostFragment.findNavController(this).navigate(directionToFragment2)

作為一種(不太推薦的)替代方法,您還可以使用LocalView.current.findNavController()作為 Fragments 在視圖級別填充NavController並且LocalView指向托管您的 Composable 的ComposeView

暫無
暫無

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

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