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

8 просмотров

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

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

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

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

вопрос: кто как решает вопрос с динамической подгрузкой скриптов для отдельных страниц с включенным turbo router?
Sergei Toroptsev
25
Всем добрый вечер. Нужна помощь с прикруткой telegram-vapor-bot к проекту Vapor. Удалось после старта приложения отправить тестовое сообщение в бот, вот только сразу после это...
advanc3d
3
Всем привет! Может кто поможет разобраться с чёрной магией? (во всяком случае для меня) Дело вот в чём - написал я код для общения с tmc2209 драйвером по half duplex uart. М...
pronvis
4
Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
Всем привет, а может кто-то подсказать какие-то советы или типо того, как оптимальнее всего сапортить сервисы в разных локациях (канада + австралия + евпропа)? Будет ли ошибк...
Stas
8
Друзья, за кем?
Magic
12
Это что теперь, любой бот сможет принимать платежи без ебли с юр лицами?
Lencore
8
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
Не догоняю немного каким боком тут эппл Вот есть веб (мини) апп, который по факту веб сайт, просто в телеге веб вью и если там оплата, то нежно вот эти приседания?
e\\/gen
7
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
Карта сайта