什么时候会单独使用 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() 的许多论点