Advertisement
ZelimkhanMezhidov

Untitled

Feb 28th, 2024
1,531
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.60 KB | None | 0 0
  1. interface RootComponent {
  2.  
  3.     val childStack: Value<ChildStack<*, Child>>
  4.  
  5.     fun onBackClicked(toIndex: Int)
  6.  
  7.     fun onHomeTabClicked()
  8.     fun onCartTabClicked()
  9.     fun onProfileTabClicked()
  10.  
  11.  
  12.     // Определяет все возможные дочерние компоненты
  13.     sealed class Child {
  14.         class HomeChild(val component: HomeComponent) : Child()
  15.         class CartChild(val component: CartComponent) : Child()
  16.         class ProfileChild(val component: ProfileComponent) : Child()
  17.     }
  18. }
  19.  
  20.  
  21. class DefaultRootComponent(componentContext: ComponentContext):RootComponent,ComponentContext by componentContext {
  22.  
  23.     private val navigation = StackNavigation<Config>()
  24.  
  25.     override val childStack: Value<ChildStack<*, RootComponent.Child>> =
  26.         childStack(
  27.             source = navigation,
  28.             serializer = Config.serializer(),
  29.             initialConfiguration = Config.Home, // // Исходный дочерний компонент — Home
  30.             handleBackButton = true, // Автоматически извлекать из стека при нажатии кнопки «Назад»
  31.             childFactory = ::child,
  32.         )
  33.  
  34.     private fun child(config: Config, componentContext: ComponentContext): RootComponent.Child =
  35.         when (config) {
  36.             is Config.Home -> HomeChild(homeComponent(componentContext))
  37.             is Config.Cart -> CartChild(cartComponent(componentContext))
  38.             is Config.Profile -> ProfileChild(profileComponent(componentContext))
  39.         }
  40.  
  41.     private fun homeComponent(componentContext: ComponentContext): HomeComponent =
  42.         DefaultHomeComponent(componentContext = componentContext)
  43.  
  44.     private fun cartComponent(componentContext: ComponentContext): CartComponent =
  45.         DefaultCartComponent(componentContext = componentContext)
  46.  
  47.     private fun profileComponent(componentContext: ComponentContext): ProfileComponent =
  48.         DefaultProfileComponent(componentContext = componentContext)
  49.  
  50.  
  51.  
  52.     override fun onBackClicked(toIndex: Int) { navigation.popTo(index = toIndex) }
  53.  
  54.     override fun onHomeTabClicked() {
  55.       navigation.bringToFront(Config.Home)
  56.     }
  57.  
  58.     override fun onCartTabClicked() {
  59.         navigation.bringToFront(Config.Cart)
  60.     }
  61.  
  62.     override fun onProfileTabClicked() {
  63.         navigation.bringToFront(Config.Profile)
  64.     }
  65.  
  66.     @Serializable // kotlinx-serialization plugin must be applied
  67.     private sealed interface Config {
  68.         @Serializable
  69.         data object Home : Config
  70.  
  71.         @Serializable
  72.         data object Cart : Config
  73.  
  74.         @Serializable
  75.         data object Profile : Config
  76.  
  77. //        @Serializable
  78. //        data class Cart(val item: String) : Config
  79. //
  80. //        @Serializable
  81. //        data class Profile(val item: String) : Config
  82.     }
  83. }
  84.  
  85.  
  86. interface HomeComponent {
  87.     val model: Value<Model>
  88.  
  89.     fun onItemClicked(item: String)
  90.  
  91.     data class Model(
  92.         val items: List<String>,
  93.     )
  94. }
  95.  
  96. class DefaultHomeComponent(componentContext: ComponentContext) : HomeComponent {
  97.  
  98.     override val model: Value<HomeComponent.Model> = MutableValue(HomeComponent.Model(items = List(100) { "Item $it" }))
  99.     override fun onItemClicked(item: String) {}
  100. }
  101.  
  102. interface CartComponent
  103.  
  104.  
  105. class DefaultCartComponent(componentContext: ComponentContext) : CartComponent, ComponentContext by componentContext {
  106.  
  107.     // Omitted code
  108.  
  109. }
  110.  
  111. interface ProfileComponent
  112.  
  113.  
  114. class DefaultProfileComponent(componentContext: ComponentContext) : ProfileComponent, ComponentContext by componentContext {
  115.  
  116.     // Omitted code
  117.  
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement