Понимание шаблона команд для навигации из ViewModel - PullRequest
0 голосов
/ 21 марта 2020

Я прочитал статью в блоге о том, как использовать Android Компонент архитектуры в реальном приложении под названием Использование компонента архитектуры навигации в крупном банковском приложении

В разделе Как перемещаться из ViewModels? однако есть одна вещь, которую я не понимаю. Команда определяется следующим образом:

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 как в object Back: NavigationCommand()?

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Код написан на Kotlin языке. Он использует класс sealed для определения всех команд. Чтобы узнать больше о sealed классах, используйте эту ссылку

  1. Так что он делает то, что он определяет класс NavigationCommand, а затем определяет внутренний класс To, который простирается от NavigationCommand. Вызов NavigationCommand() во время определения класса To аналогичен вызову супер-конструктора. Например, то же самое для To класса в Java можно записать так:
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;
        }

    }

}
object ключевое слово в Kotlin создает одноэлементный класс. Чтобы узнать больше о ключевом слове object, используйте эту ссылку
0 голосов
/ 21 марта 2020

фактически он использует NavigationCommand

Это механизм расширения Kotlin, класс после символа : - это просто класс, который вы расширяете. В этом случае расширяемый класс помечается как sealed - способ сделать перечисляемые классы запечатанными классами

Вы можете прочитать об объектах здесь , в этом если вместо класса используется объект, так как для этого конкретного аргумента NavigationCommand

передавать не требуется
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...