簡體   English   中英

Jetpack Compose 中的深層鏈接導航

[英]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.

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