我也读过那篇文章。
据我了解:
sealed class NavigationCommand {
data class To(val directions: NavDirections): NavigationCommand()
object Back: NavigationCommand()
data class BackTo(val destinationId: Int): NavigationCommand()
object ToRoot: NavigationCommand()
}
这提供了actions 在一种情况下可以做的所有事情。
例如,您的图表有一些片段:S -> A -> B -> C -> D。
现在,您在片段C 中。
您可能想要执行以下操作之一:
- 我想导航到 D -> sendCommand:
NavigationCommand.To(R.id.Id_Of_D)
- 我想导航到上一个屏幕:-> sendCommand:
NavigationCommand.Back
- 我想导航回
A -> sendCommand: NavigationCommand.BackTo(R.id.Id_Of_A)
- 我想导航回当前图的根:-> sendCommand:
NavigationCommand.ToRoot)
原来如此。
您需要从视图模型发送一些命令,之后视图模型会将该事件触发到实时数据。
接下来,最重要的在这里 - How is that event is comsumed。
你得看看BaseFragment
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
vm?.navigationCommands?.observe { command ->
when (command) {
is NavigationCommand.To ->
findNavController().navigate(command.directions)
…
文章中有小工具。
但是对于完整的实现,它看起来像这样:
BaseFragment.kt
open class BaseFragment : Fragment() {
open val baseViewModel: BaseViewModel? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
baseViewModel?.navigationCommands?.observeEventNonNull(viewLifecycleOwner) { command ->
val navController = findNavController()
when (command) {
is NavigationCommand.To -> navController.navigate(command.directions)
NavigationCommand.Back -> navController.popBackStack()
is NavigationCommand.BackTo ->
navController.popBackStack(command.destinationId, false)
NavigationCommand.ToRoot ->
navController.popBackStack(navController.graph.startDestination, false)
}
}
}
}
所以,到目前为止,您会看到,我们在视图模型中发布到navigationCommands 的所有事件都在这里处理。
祝你编码愉快!