我读了一篇关于如何在实际应用程序中使用 Android 架构组件的博客文章,标题为在大型银行应用程序中使用导航架构组件
在"如何从视图模型导航?"部分中,有一件事我不明白。命令定义如下:
sealed class NavigationCommand {
data class To(val directions: NavDirections): NavigationCommand()
object Back: NavigationCommand()
data class BackTo(val destinationId: Int): NavigationCommand()
object ToRoot: NavigationCommand()
}
我不明白的是,在NavigationCommand
内部,它实际上再次使用了NavigationCommand
,就像在data class To(val directions: NavDirections): NavigationCommand()
中一样 - 这不会以无限递归告终吗?另外,像在object Back: NavigationCommand()
中使用这样的object
是什么意思?
我也读过那篇文章。 据我了解:
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
的所有事件都在这里处理。
有一个好的编码!
它实际上使用NavigationCommand
这是 Kotlin 的扩展机制,:
字符后面的类就是你要扩展的类。在这种情况下,正在扩展的类被标记为sealed
- 一种使类可枚举的密封类的方法
您可以在此处阅读有关对象的信息,在这种情况下,使用对象代替类,因为不需要使用此特定NavigationCommand
传递参数
代码是用 Kotlin 语言编写的。它使用类sealed
来定义所有命令。要了解有关sealed
课程的更多信息,请使用此链接
- 所以它所做的是定义类
NavigationCommand
,然后定义从NavigationCommand
扩展的内部类To
。在定义To
类期间调用NavigationCommand()
与调用超级构造函数相同。例如,Java 中To
类的相同内容可以这样编写:
public class NavigationCommand {
public static class To extends NavigationCommand {
private NavDirections directions;
public To(NavDirections directions) {
super(); // This is the same as calling "NavigationCommand()" in To class definition
this.directions = directions;
}
}
}
- Kotlin 中的
object
关键字创建单例类。要了解有关object
关键字的更多信息,请使用此链接