[英]Deep Links navigation in Jetpack Compose
我想使用 Jetpack Compose 的 Nav Host 的深層鏈接,並在 Compose Navigation 上關注此頁面: https://developer.android.com/jetpack/compose/navigation#deeplinks
我的實現:AndroidManifest.xml:
<application ...>
<activity
...
android:allowTaskReparenting="true"
android:launchMode="singleInstance">
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="xkcd.com" />
<data android:scheme="https" android:host="www.xkcd.com" />
</intent-filter>
</activity>
</application>
MainActivity.onCreate().setContent{}
val rootUri = "https://www.xkcd.com"
NavHost(navController = navController, startDestination = "mainView") {
composable("mainView", deepLinks = listOf(navDeepLink { uriPattern = rootUri })) {
MainContent()
}
composable(
route = "singleView/{number}",
arguments = listOf(navArgument("number") { type = NavType.IntType }),
deepLinks = listOf(navDeepLink { uriPattern = "$rootUri/{number}" })
) { backStackEntry ->
val number = backStackEntry.arguments?.getInt("number")
SingleView(number)
}
}
如果我現在單擊相應的鏈接,應用程序會打開,但導航不起作用
問題在於 Activity launchMode :
文檔說強烈建議在使用導航時始終使用standard
的默認launchMode
。 使用標准啟動模式時,Navigation 通過調用handleDeepLink()自動處理深層鏈接,以處理 Intent 中的任何顯式或隱式深層鏈接。 但是,如果在使用諸如launchMode
類的備用啟動模式時重新使用 Activity,這不會自動singleTop
。 在這種情況下,需要在onNewIntent()
中手動調用handleDeepLink()
,如下例所示:
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
navController.handleDeepLink(intent)
}
我通過刪除它來工作
android:launchMode="singleInstance"
從清單
對於 Kamil,您可以將 navController 保存到 viewModel,然后在 onNewIntent 方法中重用它。
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val model: MainModel by viewModels()
setContent {
val navController = rememberNavController()
model.navController = navController
MyTheme {
Scaffold {
NavigationComponent(navController)
}
}
}
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
val model: MainModel by viewModels()
model.navController.handleDeepLink(intent)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.