Я хочу использовать класс держателя состояния, чтобы сохранять некоторые параметры состояния на уровне приложения, например, если необходимо отобразить диалоговое окно. Для этого я добавил переменные заголовка и сообщения в класс держателя состояния приложения. Когда я устанавливаю для них значение, отличное от нуля, в моем приложении должно отображаться диалоговое окно, потому что я проверяю, отличаются ли эти переменные от нуля, чтобы отобразить их на моем компонуемом экране. Что-то не работает, потому что, когда я устанавливаю для этих переменных значение, отличное от нуля, ничего не происходит. Кажется, рекомпозиция не запускается.
Это компонуемое состояние приложения и функция запоминания, которую я использую для его запоминания:
val appStateHolder = rememberAppStateHolder()
@Composable
fun rememberAppStateHolder(
navController: NavHostController = rememberNavController(),
dialogTitle: StringResource? = null,
dialogMessage: StringResource? = null,
): AppStateHolder {
return remember(
navController,
dialogTitle,
dialogMessage
) {
AppStateHolder(
navController = navController,
dialogTitle = dialogTitle,
dialogMessage = dialogMessage
)
}
}
Подробнее:
@Stable
class AppStateHolder(
val navController: NavHostController = NavHostController(),
var dialogTitle: StringResource? = null,
var dialogMessage: StringResource? = null
) {
// UI State
val currentDestination: NavDestination?
@Composable get() = navController
.currentBackStackEntryAsState().value?.destination
fun isDialogEnabled(): Boolean {
return (dialogTitle != null || dialogMessage != null)
}
// UI logic
fun navigate(route: String) {
navController.navigate(route)
}
fun showDialog(dialogTitle: StringResource, dialogMessage: StringResource) {
this.dialogTitle = dialogTitle
this.dialogMessage = dialogMessage
}
fun hideDialog() {
this.dialogTitle = null
this.dialogMessage = null
}
}
Вот как я проверяю, должно ли отображаться диалоговое окно:
if (appStateHolder.isDialogEnabled()) {
MessageDialog(
title = stringResource(Res.string.about),
message = stringResource(Res.string.about_message),
onCloseRequest = { appStateHolder.hideDialog() }
)
}
Вот как я устанавливаю значения диалога, отличные от нуля:
appStateHolder.showDialog(title, message)
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-modified
Рекомпозиция не вызывается при изменении класса State Holder. ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1736026232
Anonymous
Я хочу использовать класс держателя состояния, чтобы сохранять некоторые параметры состояния на уровне приложения, например, если необходимо отобразить диалоговое окно. Для этого я добавил переменные заголовка и сообщения в класс держателя состояния приложения. Когда я устанавливаю для них значение, отличное от нуля, в моем приложении должно отображаться диалоговое окно, потому что я проверяю, отличаются ли эти переменные от нуля, чтобы отобразить их на моем компонуемом экране. Что-то не работает, потому что, когда я устанавливаю для этих переменных значение, отличное от нуля, ничего не происходит. Кажется, рекомпозиция не запускается.
Это компонуемое состояние приложения и функция запоминания, которую я использую для его запоминания:
val appStateHolder = rememberAppStateHolder()
@Composable
fun rememberAppStateHolder(
navController: NavHostController = rememberNavController(),
dialogTitle: StringResource? = null,
dialogMessage: StringResource? = null,
): AppStateHolder {
return remember(
navController,
dialogTitle,
dialogMessage
) {
AppStateHolder(
navController = navController,
dialogTitle = dialogTitle,
dialogMessage = dialogMessage
)
}
}
Подробнее:
@Stable
class AppStateHolder(
val navController: NavHostController = NavHostController(),
var dialogTitle: StringResource? = null,
var dialogMessage: StringResource? = null
) {
// UI State
val currentDestination: NavDestination?
@Composable get() = navController
.currentBackStackEntryAsState().value?.destination
fun isDialogEnabled(): Boolean {
return (dialogTitle != null || dialogMessage != null)
}
// UI logic
fun navigate(route: String) {
navController.navigate(route)
}
fun showDialog(dialogTitle: StringResource, dialogMessage: StringResource) {
this.dialogTitle = dialogTitle
this.dialogMessage = dialogMessage
}
fun hideDialog() {
this.dialogTitle = null
this.dialogMessage = null
}
}
Вот как я проверяю, должно ли отображаться диалоговое окно:
if (appStateHolder.isDialogEnabled()) {
MessageDialog(
title = stringResource(Res.string.about),
message = stringResource(Res.string.about_message),
onCloseRequest = { appStateHolder.hideDialog() }
)
}
Вот как я устанавливаю значения диалога, отличные от нуля:
appStateHolder.showDialog(title, message)
Подробнее здесь: [url]https://stackoverflow.com/questions/79329578/no-recomposition-called-when-state-holder-class-modified[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия