Size: a a a

Programming Offtop

2020 August 13

Д

Денис in Programming Offtop
abstract class UiState{
       @Composable
       abstract fun render()
   }

   abstract class Widget(
       val state: LiveData<UiState>
   )

   class UiManager(
       initialWidget: Widget
   ) {

       private var currentWidget: Widget = initialWidget
           set(value) {
               if (value == field) {
                   return
               }
               uiState.removeSource(field.state)
               uiState.addSource(value.state) {
                   uiState.postValue(it)
               }
               field = value
           }

       val uiState = MediatorLiveData<UiState>()
       
       private val stack = Stack<Widget>()
       
       init {
           stack.push(initialWidget)
       }
       
       fun replaceWidget(widget: Widget){
           stack.pop()
           stack.add(widget)
           currentWidget = widget
       }
       
       fun replaceWithBackStack(widget: Widget){
           stack.add(widget)
           currentWidget = widget
       }
       
       fun onBackPressed(){
           stack.pop()
           stack.peek()?.let {
               currentWidget = it
           }
       }
   }
что касается варианта управления навигацией первое что в голову пришло, не проверял это на работоспособность но сама суть ясна я думаю
источник

I

Igor in Programming Offtop
Денис
abstract class UiState{
       @Composable
       abstract fun render()
   }

   abstract class Widget(
       val state: LiveData<UiState>
   )

   class UiManager(
       initialWidget: Widget
   ) {

       private var currentWidget: Widget = initialWidget
           set(value) {
               if (value == field) {
                   return
               }
               uiState.removeSource(field.state)
               uiState.addSource(value.state) {
                   uiState.postValue(it)
               }
               field = value
           }

       val uiState = MediatorLiveData<UiState>()
       
       private val stack = Stack<Widget>()
       
       init {
           stack.push(initialWidget)
       }
       
       fun replaceWidget(widget: Widget){
           stack.pop()
           stack.add(widget)
           currentWidget = widget
       }
       
       fun replaceWithBackStack(widget: Widget){
           stack.add(widget)
           currentWidget = widget
       }
       
       fun onBackPressed(){
           stack.pop()
           stack.peek()?.let {
               currentWidget = it
           }
       }
   }
что касается варианта управления навигацией первое что в голову пришло, не проверял это на работоспособность но сама суть ясна я думаю
Ты за_бал со своим виджетами) и абстрактными классами

PS лучше на gist загрузить
источник

Д

Денис in Programming Offtop
Igor
Ты за_бал со своим виджетами) и абстрактными классами

PS лучше на gist загрузить
не ну а как?
источник

Д

Денис in Programming Offtop
состояние экрана одно на все приложение должно быть?
источник

AD

Aleksey D. in Programming Offtop
Igor
Я тещу Model из Tea, если там новое поле, значит и UI поменялся.

Но да, есть идеи на будущие для более умного сравнения.
Все таки json сравниваем, у него есть структура (можно добавить игнорированием новых полей).
все равно дыряво работает
источник

I

Igor in Programming Offtop
Денис
не ну а как?
источник

I

Igor in Programming Offtop
И где-нибудь в рутовой composable функции хранишь ее в state
А рендеришь через when
источник

Д

Денис in Programming Offtop
спасибо за пример, изучу
источник

Д

Денис in Programming Offtop
sealed class Screen(val id: ScreenName) {
   object Home : Screen(HOME)
   object Interests : Screen(INTERESTS)
   data class Article(val postId: String) : Screen(ARTICLE)
}

это получается состояния экранов?
источник

I

Igor in Programming Offtop
Ну даже не "ВСЕ состояние UI", а минимально достаточное для навигации
В том примере не чистый TEA
источник

Д

Денис in Programming Offtop
а откуда тогда возьмется остальное?
источник

I

Igor in Programming Offtop
источник

I

Igor in Programming Offtop
Денис
а откуда тогда возьмется остальное?
Ну видимо хранится в самих скринах, все таки это пример Compose, а не TEA
источник

Д

Денис in Programming Offtop
Igor
Ты за_бал со своим виджетами) и абстрактными классами

PS лучше на gist загрузить
вообще капец сложно отойти от парадигмы ооп, тут все на каких то функциях, вообще не привычно
источник

Д

Денис in Programming Offtop
Igor
Ну видимо хранится в самих скринах, все таки это пример Compose, а не TEA
понял
источник

I

Igor in Programming Offtop
> вообще капец сложно отойти от парадигмы ооп, тут все на каких то функциях, вообще не привычно


Это все потому что в универах не учат хаскелю. В недавном митапе Брагилевский на это жаловался.

PS хотя это не панацея, знаю 30-летнего, ручного-тестировщика у которого Agda была в универе)
источник

AN

Alexander Nozik in Programming Offtop
Igor
> вообще капец сложно отойти от парадигмы ооп, тут все на каких то функциях, вообще не привычно


Это все потому что в универах не учат хаскелю. В недавном митапе Брагилевский на это жаловался.

PS хотя это не панацея, знаю 30-летнего, ручного-тестировщика у которого Agda была в универе)
Хаскелю учат больше, чем котлин
источник

I

Igor in Programming Offtop
99% java, 0.7% haskell, 0.3% kotlin
источник

Д

Денис in Programming Offtop
то есть грубо говоря при таком подходе в приложении кроме активити нет классов на presentation уровне по крайне мере? тип никаких презентеров, все в функциях?
источник

(

( in Programming Offtop
Andrew Mikhaylov
Бойлерплейт для распиливания это в разрезанную очередь (или как там называется структура данных под капотом компоуза) никто не отменял.
Gap Buffer?
источник