То в компоузе мне нужно сделать так ? Text(

modifier = Modifier.padding(
bottom = 8.dp
),
text = when(viewmodel.state) {
State.SignUpSuccess -> “Some text 1”
State.LoadAmbassadorCodeAndReferralNameSuccess -> “Some text 2”
State.SignUpError -> “Some text 3”
}
)

35 ответов

19 просмотров

Вы читали официальную документацию по Jetpack Compose?

Unknown- Автор вопроса

Ну, в принципе можно, но особо нужно. То есть, какие-то действия пользователя транслируются в VM. VM что-то там делает с этим и присылает измененный стейт в LiveData, Composable функция слушает эти апдейты, тригерится на обновление и рендерит экран с измененными данными

Unknown- Автор вопроса
Konstantin Zolotov
Ну, в принципе можно, но особо нужно. То есть, к...

Ну, в принципе можно, но особо нужно. - Вы хотели сказать “Особо не нужно” ? 🙂

Да, в смысле "особо не нужно"

Unknown- Автор вопроса
Konstantin Zolotov
Да, в смысле "особо не нужно"

Для полного понимания ситуации Вот к примеру я меняю текст и видимость, если стейт во вьюмодели меняется на LoadAmbassadorCodeAndReferralNameSuccess Мне во вью модели нужно создать 2 mutableState переменные: signUpReferralProgramInvitationTitleText и signUpReferralProgramInvitationRootVisibility И напрямую прописывать их в Compose компоненте А если у меня в одном блоке меняется 20 значений разных в вьюх, а не только текст и видимость. Я получается должен создавать 20 mutableState переменных во вью модели только для одного этого условия А если таких условий у меня 10 Это же дикий ад будет потом во вьюмодели))

Unknown
screenshot Для полного понимания ситуации Вот к примеру я ме...

data class ScreenState( val signUpReferralProgramInvitationTitleText: String? // ну или какой там тип подойдет ... // все другие 20 значений для отображения. Возможно сгруппированные по еще каким-то структурам ) потом где-то в composable-функции @Composable fun Screen(viewmodel: SignupViewModel) { val state by viewmodel.state.observeAsState() state.signUpReferralProgramInvitationTitleText?.let { Text( value = stringResource(R.string.blah_blah, it) ) } }

Konstantin Zolotov
data class ScreenState( val signUpReferralProg...

А, ну и в самой VM class SignupViewModel(...) : ViewModel() { val state: LivaData<ScreenState> = ... }

Unknown- Автор вопроса

как же трудно перепиской все обьяснить 😂 у меня не дата класс, a sealed выше него а c sealed классом получается нужно через expression смотреть какой именно сейчас state у вьюмодели и отталкиваясь от него уже сетить свое значение то, что я предложил, а вы сказали, что так не нужно)

Unknown
как же трудно перепиской все обьяснить 😂 у меня не...

Ну data class может быть внутри sealed class. Вот там на скриншоте выше много наследников sealed class, что они обозначают?

Unknown- Автор вопроса
Konstantin Zolotov
Ну data class может быть внутри sealed class. Вот ...

Они нужны для того, чтобы для каждый такой наследник имел свой блок с условиями sealed class State { data class A (val someVar: String ….) object B object C etc. } А во вьюмодели например в конце загрузки данных присваиваю state (она же LiveData) значение наследника A и в активити так как это все тригерится - уже выполняю что находится в блоке A viewmodel.state.observe(this) { when(it) { A -> { textinput.text = “Change some text” progressBar = visible etc } } }

Нене, я имею в виду, какой у них смысл? Вот есть экран, насколько я понял, регистрации. Что конкретно каждый наследник значит?

Unknown- Автор вопроса
Konstantin Zolotov
Нене, я имею в виду, какой у них смысл? Вот есть э...

SignUpSuccess - регистрация успешно заверщшена LoadAmbassadorCodeAndReferralNameSuccess - подгрузилась дата по реферальной программе SignUpError - ошибка при решистрации

Unknown
SignUpSuccess - регистрация успешно заверщшена Lo...

Я тогда вообще не понимаю, в чем проблема

Unknown
😂

Ну то есть в том стейте должны быть все необходимые данные для рендеринга экрана. Под каждый экран своя структура с описанием стейта.

Unknown- Автор вопроса
Konstantin Zolotov
Ну то есть в том стейте должны быть все необходимы...

Под каждый экран своя структура с описанием стейта - Что вы имели ввиду ?

Unknown- Автор вопроса
Denis K
+1 )

Подскажите тогда, если знаете

Unknown
Подскажите тогда, если знаете

так я не понял, в чем вообще проблема.... мысль размазана по нескольким сообщениям и смысл ускользает

Unknown
Под каждый экран своя структура с описанием стейта...

Я имею в виду, что для каждого экрана существует свой data/sealed class со всеми необходимыми данными. На основе этой структуры composable функция рендерит все что надо.

Unknown- Автор вопроса
Denis K
так я не понял, в чем вообще проблема.... мысль ра...

Мне это нужно использовать в Compose функции

Unknown- Автор вопроса
Konstantin Zolotov
Я имею в виду, что для каждого экрана существует с...

Все равно не понимаю У меня во вьюмодели есть набор готовых data classes and objects Если обзервить в активити эти стейты, то как потом менять что-то в самой composable функции с активити / фрагмента? Нужно значит тригерить это внутри Composable функции, чтобы напрямую иметь доступ ко вью Вижу решение как и писал выше - если текст может меняться во вьюхе в при 3 разных стейтах, тогда пишем так Text( modifier = Modifier.padding( bottom = 8.dp ), text = when(viewmodel.state) { State.SignUpSuccess -> “Some text 1” State.LoadAmbassadorCodeAndReferralNameSuccess -> “Some text 2” State.SignUpError -> “Some text 3” } ) ну и так далее с другими параметрами у компонентов если нужен доступ к активити - передает колбеком в активити обратно

Unknown
Все равно не понимаю У меня во вьюмодели есть на...

все равно не понимаю, в чем проблема... понятно, что подход, что применялся в UI с вьюхами для композа не совсем подходит. надо переосмысливать и переделывать. про вызов другой активити - у меня или дежавю, или это уже обсуждали.

Unknown
Все равно не понимаю У меня во вьюмодели есть на...

Руками тригерить ничего не надо. При изменении state который вот этот стейт наступает рекомпозиция. А чтобы был этот стейт нужно вызвать livedata.observeAsState()

Unknown- Автор вопроса
Unknown- Автор вопроса
Konstantin Zolotov
Руками тригерить ничего не надо. При изменении sta...

Мне просто хочется понять пример как это применить в своем случае Я про эти стейты уже все вдоль и поперек прочитал и кучу видео пересмотрел) как мне правильно вот это вот к примеру реализовать с compose ?

Unknown
screenshot Мне просто хочется понять пример как это применить...

это какой то «неправильный» стейт, имхо. для композа по крайней мере. для композа я п пересмотрел подход. в UiState завел бы поле extraInfo: String/Int, и назначал бы его в vm в зависимости от того, что там произошло в юзкейсе SignUp-а

Unknown
Что такое UIState ?

стейт экрана для композа

Unknown- Автор вопроса

Не понимаю Что этот стейт хранит ? Откуда он берется ?

Unknown
Не понимаю Что этот стейт хранит ? Откуда он бере...

😔 нельзя просто взять старую логику(vm) из классических вьюх и втащить ее в композ. т.к получится знатный винегрет. могу ошибаться, конечно. поправьте если что.

Unknown- Автор вопроса
Denis K
😔 нельзя просто взять старую логику(vm) из классич...

Я хочу перетащить логику из классичекого vm Я хочу понять как это работает на простом примере

Unknown
Не понимаю Что этот стейт хранит ? Откуда он бере...

Стейт хранит все динамические данные. Есть мокап экрана, который должен быть на выходе?

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

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

Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
7
День добрый, подскажите пожалуйста, есть ли какой-то способ сказать ребару не компилировать определённое приложение? Всю доку их перечиатл ничего подобного не нашёл
Кирилл
14
Вопрос на перед, на следующую пятницу. Сколько строк кода можно вешать на одного программиста, понятно что если проект хорошо написан то можно и миллион. Но есть же где то пре...
AlekseyK Kluchnikov
31
Немного оффтопа: а кто на чем сидит для осдева в плане ide/редактора? Последнее время сидел на vscode, но я его прям не могу нормально воспринимать, перешел на сlion, но меня...
Evg Resh
29
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Что за японодичь? Мне хоть m68k, хоть 8080, 8088, на любом можно что-то создать
Егор
5
Вот объясните, как это работает: Вот есть допустим unix-подобная система, и программа запускает допустим printf или fork, как это передается ядру, и как оно обрабатывать начин...
Егор
14
и да, кто сказал что у эпла именно такой isa?
Boris Vinogradov
5
Добрый день. Мне посоветовали обратиться к вам в чат за помощью. Ситуация описана на скрине. Как мне сказали, мне на бота навесили флудвейт. Есть ли возможность снять его ра...
OVERLINK
7
Карта сайта