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)
}