LaunchedEffect не срабатывает при добавлении нового профиля в Jetpack ComposeAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 LaunchedEffect не срабатывает при добавлении нового профиля в Jetpack Compose

Сообщение Anonymous »

Я работаю над приложением Jetpack Compose, в котором пользователи могут управлять профилями входа. Профили хранятся в базе данных помещений, а пользовательский интерфейс отображает профили в раскрывающемся меню. Блок LaunchedEffect в моем LoginScreen должен реагировать на изменения в списке профилей (профилях), который отображается как StateFlow из LoginViewModel.
Когда я редактирую или удаляю профиль, Запускается LaunchedEffect, и журналы подтверждают, что получен обновленный список профилей. Однако когда я добавляю новый профиль, LaunchedEffect не срабатывает.
просмотреть код модели:

Код: Выделить всё

private val _profiles = MutableStateFlow(emptyList())
val profiles: StateFlow = _profiles

init {
fetchProfiles()
}

fun fetchProfiles() {
viewModelScope.launch {
val currentProfiles = database.loginProfileDao().getAllProfiles()
_profiles.value = currentProfiles
Log.d("Profile_Test", "Profiles fetched from DB: $_profiles")
}
}

fun saveProfileToDatabase(profile: LoginProfile) {
viewModelScope.launch {
database.loginProfileDao().insertProfile(profile)
fetchProfiles()
}
}
Код пользовательского интерфейса:

Код: Выделить всё

@Composable
fun ProfileDropdown(loginViewModel: LoginViewModel) {
var expanded by remember { mutableStateOf(false) }
var selectedItem by remember { mutableStateOf(null) }

val profiles = loginViewModel.profiles.collectAsState().value

LaunchedEffect(profiles) {
Log.d("Profile_Test", "Launched Effect: $profiles")
if (profiles.isNotEmpty() && selectedItem != profiles.last()) {
selectedItem = profiles.last()
loginViewModel.selectedProfile.value = profiles.last()
} else if (profiles.isEmpty()) {
selectedItem = null
loginViewModel.selectedProfile.value = null
}
}

ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = !expanded }
) {
OutlinedTextField(
value = selectedItem?.name ?: "Select Profile",
onValueChange = {},
readOnly = true,
trailingIcon = {
ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded)
}
)
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
profiles.forEach { profile ->
DropdownMenuItem(
text = { Text(profile.name) },
onClick = {
selectedItem = profile
loginViewModel.selectedProfile.value = profile
expanded = false
}
)
}
}
}
}
Почему LaunchedEffect не срабатывает при добавлении нового профиля, хотя _profiles обновляется? Есть ли что-то, чего мне не хватает в работе StateFlow или LaunchedEffect в Compose?
Буду очень признателен за любую помощь или рекомендации! Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/792 ... ck-compose
Ответить

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

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

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

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

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