То в компоузе мне нужно сделать так ? 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 ответов

21 просмотр

Вы читали официальную документацию по 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
Не понимаю Что этот стейт хранит ? Откуда он бере...

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

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

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

Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
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
Карта сайта