Я только что обновил зависимости для: < /p>
androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "nav3Core" }
androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "nav3Core" }
androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "lifecycleViewmodelNav3" }
< /code>
from: < /p>
nav3Core = "1.0.0-alpha03"
lifecycleViewmodelNav3 = "1.0.0-alpha01"
< /code>
to: < /p>
nav3Core = "1.0.0-alpha04"
lifecycleViewmodelNav3 = "1.0.0-alpha02"
Как объявлено здесь и здесь, и функция oncleared () внутри ViewModel больше не вызывается. С предыдущими версиями это работало нормально. Как решить эту проблему? У меня есть только два экрана, и я перемещаюсь с одного экрана к другому на кнопке нажатия. Итак, вот мой код: < /p>
@Composable
fun AppNavDisplay(
backStack: NavBackStack
) {
NavDisplay(
entryDecorators = listOf(
rememberSceneSetupNavEntryDecorator(),
rememberSavedStateNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator()
),
backStack = backStack,
onBack = {
backStack.removeLastOrNull()
},
entryProvider = entryProvider {
entry {
SignInScreen(
onClearAndNavigate = backStack::onClearAndNavigate
)
}
entry {
MainScreen(
onClearAndNavigate = backStack::onClearAndNavigate
)
}
}
)
}
fun NavBackStack.onClearAndNavigate(screen: Screen) {
clear()
add(screen)
}
< /code>
Вот моя SigniNviewModel: < /p>
class SignInViewModel(
private val repo: AuthRepository
): ViewModel() {
val signInState = ResponseStateHandler()
fun signIn() = viewModelScope.launch {
try {
signInState.setLoading()
repo.signIn()
signInState.setSuccess(Unit)
} catch (e: Exception) {
signInState.setFailure(e.message!!)
}
}
override fun onCleared() {
Log.d(TAG, "signInViewModel.onCleared") //Not called
signInState.setIdle()
}
}
< /code>
И вот как использовать результат в пользовательском интерфейсе: < /p>
val signInResponse by viewModel.signInState.collect()
LaunchedEffect(signInResponse) {
signInResponse.onSuccess {
onClearAndNavigate(Screen.Main)
}.onFailure { message ->
showMessage(context, "$message")
viewModel.signInState.setIdle()
}
}
Единственная вещь, которая делает Oncleareed не называть, - это обновление зависимостей.Scaffold(
modifier = Modifier.fillMaxSize()
) { innerPadding ->
Box(
modifier = Modifier.fillMaxSize().padding(innerPadding),
contentAlignment = Alignment.Center
) {
Button(
onClick = viewModel::signIn,
enabled = !isProcessing
) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "SignIn"
)
Spacer(
modifier = Modifier.width(4.dp)
)
if (isProcessing) {
CircularProgressIndicator(
modifier = Modifier.size(12.dp),
strokeWidth = 2.dp
)
}
}
}
}
}
< /code>
и: < /p>
val isUserSignedOut by viewModel.isSignedOutState.collectAsStateWithLifecycle()
LaunchedEffect(isUserSignedOut) {
if (isUserSignedOut) {
onClearAndNavigate(Screen.SignIn)
}
}
Scaffold(
modifier = Modifier.fillMaxSize()
) { innerPadding ->
Box(
modifier = Modifier.fillMaxSize().padding(innerPadding),
contentAlignment = Alignment.BottomCenter
) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Button(
onClick = viewModel::deleteUser,
enabled = !isProcessing
) {
Text(
text = "SignOut"
)
Spacer(
modifier = Modifier.width(4.dp)
)
if (isProcessing) {
CircularProgressIndicator(
modifier = Modifier.size(12.dp),
strokeWidth = 2.dp
)
}
}
}
}
}
edit3:
sealed interface Screen: NavKey {
@Serializable
data object Main : Screen
@Serializable
data object SignIn : Screen
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... avigation3
ViewModel#OnCleared больше не вызывается в навигации3 ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1759016186
Anonymous
Я только что обновил зависимости для: < /p>
androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "nav3Core" }
androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "nav3Core" }
androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "lifecycleViewmodelNav3" }
< /code>
from: < /p>
nav3Core = "1.0.0-alpha03"
lifecycleViewmodelNav3 = "1.0.0-alpha01"
< /code>
to: < /p>
nav3Core = "1.0.0-alpha04"
lifecycleViewmodelNav3 = "1.0.0-alpha02"
Как объявлено здесь и здесь, и функция oncleared () внутри ViewModel больше не вызывается. С предыдущими версиями это работало нормально. Как решить эту проблему? У меня есть только два экрана, и я перемещаюсь с одного экрана к другому на кнопке нажатия. Итак, вот мой код: < /p>
@Composable
fun AppNavDisplay(
backStack: NavBackStack
) {
NavDisplay(
entryDecorators = listOf(
rememberSceneSetupNavEntryDecorator(),
rememberSavedStateNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator()
),
backStack = backStack,
onBack = {
backStack.removeLastOrNull()
},
entryProvider = entryProvider {
entry {
SignInScreen(
onClearAndNavigate = backStack::onClearAndNavigate
)
}
entry {
MainScreen(
onClearAndNavigate = backStack::onClearAndNavigate
)
}
}
)
}
fun NavBackStack.onClearAndNavigate(screen: Screen) {
clear()
add(screen)
}
< /code>
Вот моя SigniNviewModel: < /p>
class SignInViewModel(
private val repo: AuthRepository
): ViewModel() {
val signInState = ResponseStateHandler()
fun signIn() = viewModelScope.launch {
try {
signInState.setLoading()
repo.signIn()
signInState.setSuccess(Unit)
} catch (e: Exception) {
signInState.setFailure(e.message!!)
}
}
override fun onCleared() {
Log.d(TAG, "signInViewModel.onCleared") //Not called
signInState.setIdle()
}
}
< /code>
И вот как использовать результат в пользовательском интерфейсе: < /p>
val signInResponse by viewModel.signInState.collect()
LaunchedEffect(signInResponse) {
signInResponse.onSuccess {
onClearAndNavigate(Screen.Main)
}.onFailure { message ->
showMessage(context, "$message")
viewModel.signInState.setIdle()
}
}
Единственная вещь, которая делает Oncleareed не называть, - это обновление зависимостей.Scaffold(
modifier = Modifier.fillMaxSize()
) { innerPadding ->
Box(
modifier = Modifier.fillMaxSize().padding(innerPadding),
contentAlignment = Alignment.Center
) {
Button(
onClick = viewModel::signIn,
enabled = !isProcessing
) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "SignIn"
)
Spacer(
modifier = Modifier.width(4.dp)
)
if (isProcessing) {
CircularProgressIndicator(
modifier = Modifier.size(12.dp),
strokeWidth = 2.dp
)
}
}
}
}
}
< /code>
и: < /p>
val isUserSignedOut by viewModel.isSignedOutState.collectAsStateWithLifecycle()
LaunchedEffect(isUserSignedOut) {
if (isUserSignedOut) {
onClearAndNavigate(Screen.SignIn)
}
}
Scaffold(
modifier = Modifier.fillMaxSize()
) { innerPadding ->
Box(
modifier = Modifier.fillMaxSize().padding(innerPadding),
contentAlignment = Alignment.BottomCenter
) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Button(
onClick = viewModel::deleteUser,
enabled = !isProcessing
) {
Text(
text = "SignOut"
)
Spacer(
modifier = Modifier.width(4.dp)
)
if (isProcessing) {
CircularProgressIndicator(
modifier = Modifier.size(12.dp),
strokeWidth = 2.dp
)
}
}
}
}
}
[b] edit3: [/b]
sealed interface Screen: NavKey {
@Serializable
data object Main : Screen
@Serializable
data object SignIn : Screen
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79672075/viewmodeloncleared-not-called-anymore-in-navigation3[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия