ViewModel#OnCleared больше не вызывается в навигации3Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 ViewModel#OnCleared больше не вызывается в навигации3

Сообщение 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
)
}
}
}
}
}

edit3:
sealed interface Screen: NavKey {
@Serializable
data object Main : Screen
@Serializable
data object SignIn : Screen
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... avigation3
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»