什么时候会单独使用 findNavController 方法而不是 NavHostFragment?

Posted

技术标签:

【中文标题】什么时候会单独使用 findNavController 方法而不是 NavHostFragment?【英文标题】:When would one use the findNavController method by itself instead of NavHostFragment? 【发布时间】:2021-01-04 08:31:35 【问题描述】:

我正在编写一个在 Kotlin here 中使用 LiveData 的教程,并且在说明中我的一个片段说要像这样使用 NavHostFragment:

    /**
     * Called when the game is finished
     */
    private fun gameFinished() 
        Toast.makeText(activity, "Game has just finished.", Toast.LENGTH_LONG).show()
        val action = GameFragmentDirections.actionGameToScore()
        action.score = viewModel.score.value?:0
        NavHostFragment.findNavController(this).navigate(action)
        viewModel.onGameFinishComplete()
    

但是,我最终在另一个片段中设置了一个带有 lambda 函数的 Observer,他们说在本节中单独使用 findNavController 而没有参数:

        viewModelFactory = ScoreViewModelFactory(ScoreFragmentArgs.fromBundle(requireArguments()).score)
        viewModel = ViewModelProvider(this, viewModelFactory).get(ScoreViewModel::class.java)
        // sets observer
        viewModel.score.observe(viewLifecycleOwner, Observer newScore ->
            binding.scoreText.text = newScore.toString()
        )
        viewModel.eventPlayAgain.observe(viewLifecycleOwner, Observer playAgain ->
            if(playAgain) 
                findNavController().navigate(ScoreFragmentDirections.actionRestart())
                viewModel.onPlayAgainComplete()
            

        )

我不完全确定为什么需要调用 NavHostFragment 类的静态方法,并在第一段代码中将“this”作为上下文发送,但为什么可以单独调用该方法第二个。 Observer 或 viewLifecycleOwner 或 viewModel 是否在这个包装的块中生成隐含的上下文?

【问题讨论】:

【参考方案1】:

它们都是相同的方法。 Fragment的findNavController源码是

fun Fragment.findNavController(): NavController =
        NavHostFragment.findNavController(this)

【讨论】:

以上是关于什么时候会单独使用 findNavController 方法而不是 NavHostFragment?的主要内容,如果未能解决你的问题,请参考以下文章

Android 未解决的参考:findNavController 错误

对于公共乐趣 Fragment.findNavController() 的许多论点

MySQL单独存放表空间Innodb_file_per_table

为啥 Azure 流分析将数据输出到单独的文件?

kafka

脚本单独调用django模块