Привет. Снова вопрос про работу с состояниями в Compose. Насколько я

понял, есть два варианта работы со стейтами:

1) Простые (назову из плоские) дата классы:

data class MyState(
val myName: String = "",
val myList: List<String> = emptyList()
)

class MyViewModel() {
var state by mutableStateOf(MyState())

init {
// Начальное состояние
state = MyState(myName="asdasd", myList=listOf("asd","asd")
....
// Если надо изменить что-то в стейте
state = state.copy(myName = "123123")
}
}

2) Стейт классы с наблюдаемыми полями (observable)

class MyState() {
var myName by mutableStateOf("")
var myList by mutableStateOf<List<String>>(emptyList())
}

class MyViewModel() {
var state by mutableStateOf(MyState())

init {
// Начальное состояние
state = MyState().apply {
myName = "asdasd"
myList = listOf("sadasda")
}
....
// Если надо изменить что-то в стейте
state.myName = "123123"
}
}

Код примерный.
Второй вариант используется в самом компоуз для состояний всяких компонентов - списков, пейджеров, итд.

Кто какой вариант использует. Есть ли какие-то рекомендации? Может есть продакш приложение как пример на Гитхабе, от того же Гугла , например

25 ответов

30 просмотров

Можно пользоваться только первым что я и делаю

data class MyState( val myName: String = "", val myList: List<String> = emptyList() ) а так не красивше ли?

Aleksandr-Petrov Автор вопроса
Denis K
data class MyState( val myName: String = "", ...

там у мпня вроде также первый вариант напиан

Aleksandr-Petrov Автор вопроса
Denis K
я про форматирование)

ни имеет значения)

Aleksandr-Petrov Автор вопроса
Silent829
Можно пользоваться только первым что я и делаю

напишите подробнее, почему вы юзаете первый вариант

Aleksandr-Petrov Автор вопроса
Denis K
data class MyState( val myName: String = "", ...

как сделать форматирование такое?

Aleksandr Petrov
как сделать форматирование такое?

в настольной версии TG - Ctrl+Shift+M, в мобильной через выделение текста, Mono

Aleksandr Petrov
как сделать форматирование такое?

Или завернуть текст в символы `. ``` для многострочного текста.

Denis K
data class MyState( val myName: String = "", ...

само состояние не должно отвечать за его значения

Silent829
само состояние не должно отвечать за его значения

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

Aleksandr Petrov
напишите подробнее, почему вы юзаете первый вариан...

мне нравится то что я во вьюмодели/компоненте пробрасываю простые сообщения Reducer-у, а в нем уже внутри описано как мутируется состояние исходя из сообщения, можно сразу несколько состояний поменять. Скоуп сужается до минимума. Меньше кода, если состояния сложности средней или высокой (много полей) и нужно сразу мутировать несколько подсостояний

Denis K
в настольной версии TG - Ctrl+Shift+M, в мобильной...

это для Windows или Linux так? на macOS ⌃ ⇧ K

Silent829
Можно пользоваться только первым что я и делаю

А как такое с Decompose/MVI-Kotlin сделать? Где этот MutableState хранить? А то я так и не понял, как правильно работать с каким-нибудь TextField или Slider

Алексей
А как такое с Decompose/MVI-Kotlin сделать? Где эт...

Есть же пример, как раз со всем перечисленным https://github.com/JetBrains/compose-jb/blob/master/examples/todoapp/common/main/src/commonMain/kotlin/example/todo/common/main/integration/TodoMainComponent.kt

Алексей
Спасибо 😊 буду смотреть

а еще может быть такое, когда нужно комбинировать несколько флоу или мерджить их

Anton Gorodetskiy
да, например поиск ( текст + чекбокс)

Да вроде текст и чекбокс оба в сторе были бы)

Silent829
Да вроде текст и чекбокс оба в сторе были бы)

смотри нужно реализовать лайв серч фильма, сервер принимает текст и тип фильма, один флоу передает текст, другой тип фильма

Похожие вопросы

Обсуждают сегодня

Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
А в каком формате фреймы? Сам формат сейчас придумываешь, или что-то готовое нужно распарсить?
Okhsunrog
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Карта сайта