Jetpack 组合深层链接处理 branch.io
Jetpack compose deeplink handling branch.io
我正在使用 branch.io 来处理深度 links。 Deep links 可以包含 JsonObject 形式的自定义元数据。可以通过在 MainActivity#onStart()
中设置一个侦听器来获取数据,当单击 link 时触发该侦听器。
override fun onStart() {
super.onStart()
Branch
.sessionBuilder(this)
.withCallback { referringParams, error ->
if (error == null) {
val eventId = referringParams?.getString("id")
//Here I would like to navigate user to event screen
} else {
Timber.e(error.message)
}
}
.withData(this.intent?.data).init()
}
当我从 referringParams
检索 eventId
时,我必须将用户导航到特定事件。当我使用带片段的导航组件时,我可以这样做:
findNavController(R.id.navHost).navigate("path to event screen")
但是使用 compose 是不同的,因为我不能在 Composable 之外使用 navController
,因为它位于 MainActivity#onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
//I cant access navController outside of composable function
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "HomeScreen",
) {
}
}
}
我的问题是,在使用 Jetpack Compose Navigation
时如何将用户从 MainActivity#onStart()
导航到特定屏幕
rememberNavController
的实现非常简单:它使用 Compose 需要的两个导航器创建 NavHostController
,并确保它在配置更改时恢复。
以下是您可以在可组合范围之外的 activity 中执行相同操作的方法:
private lateinit var navController: NavHostController
private val navControllerBundleKey = "navControllerBundleKey"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
navController = NavHostController(this).apply {
navigatorProvider.addNavigator(ComposeNavigator())
navigatorProvider.addNavigator(DialogNavigator())
}
savedInstanceState
?.getBundle(navControllerBundleKey)
?.apply(navController::restoreState)
setContent {
// pass navController to NavHost
}
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putBundle(navControllerBundleKey, navController.saveState())
super.onSaveInstanceState(outState)
}
我正在使用 branch.io 来处理深度 links。 Deep links 可以包含 JsonObject 形式的自定义元数据。可以通过在 MainActivity#onStart()
中设置一个侦听器来获取数据,当单击 link 时触发该侦听器。
override fun onStart() {
super.onStart()
Branch
.sessionBuilder(this)
.withCallback { referringParams, error ->
if (error == null) {
val eventId = referringParams?.getString("id")
//Here I would like to navigate user to event screen
} else {
Timber.e(error.message)
}
}
.withData(this.intent?.data).init()
}
当我从 referringParams
检索 eventId
时,我必须将用户导航到特定事件。当我使用带片段的导航组件时,我可以这样做:
findNavController(R.id.navHost).navigate("path to event screen")
但是使用 compose 是不同的,因为我不能在 Composable 之外使用 navController
,因为它位于 MainActivity#onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
//I cant access navController outside of composable function
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "HomeScreen",
) {
}
}
}
我的问题是,在使用 Jetpack Compose Navigation
时如何将用户从MainActivity#onStart()
导航到特定屏幕
rememberNavController
的实现非常简单:它使用 Compose 需要的两个导航器创建 NavHostController
,并确保它在配置更改时恢复。
以下是您可以在可组合范围之外的 activity 中执行相同操作的方法:
private lateinit var navController: NavHostController
private val navControllerBundleKey = "navControllerBundleKey"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
navController = NavHostController(this).apply {
navigatorProvider.addNavigator(ComposeNavigator())
navigatorProvider.addNavigator(DialogNavigator())
}
savedInstanceState
?.getBundle(navControllerBundleKey)
?.apply(navController::restoreState)
setContent {
// pass navController to NavHost
}
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putBundle(navControllerBundleKey, navController.saveState())
super.onSaveInstanceState(outState)
}