首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Jetpack编写深度链接处理branch.io

Jetpack编写深度链接处理branch.io
EN

Stack Overflow用户
提问于 2022-04-29 06:12:34
回答 1查看 323关注 0票数 1

我正在使用branch.io来处理深层链接。深度链接可以以JsonObject的形式包含自定义元数据。数据可以通过在MainActivity#onStart()中设置侦听器来获得,当单击链接时会触发监听器。

代码语言:javascript
运行
复制
   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()
}

当我从eventId检索referringParams时,我必须将用户导航到特定的事件。当我使用带有片段的导航组件时,我可以这样做:

代码语言:javascript
运行
复制
findNavController(R.id.navHost).navigate("path to event screen")

但是使用Composable是不同的,因为我不能在Composable之外使用navController,因为它位于MainActivity#onCreate()

代码语言:javascript
运行
复制
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组合导航时,如何从MainActivity#onStart()导航用户到特定屏幕?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-29 07:13:35

rememberNavController有非常简单的实现:它使用撰写所需的两个导航器创建NavHostController,并确保在配置更改时恢复。

下面是在可组合范围之外的活动中如何做同样的事情:

代码语言:javascript
运行
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72053534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档