MutablestateFlow nach abhängiger Parameterinitialisierung ändernAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 MutablestateFlow nach abhängiger Parameterinitialisierung ändern

Post by Anonymous »

App mit Raum entwickeln und komponieren. Ich möchte Folgendes erreichen: < /p>
Der Benutzer öffnet Bildschirm A mit Liste der übergeordneten Kategorien. Datenbank: < /p>

Code: Select all

    LaunchedEffect(Unit) {
if (!state.viewLoaded) {
editedCategoryId?.let { editedCategoryId ->
viewModel.onEvent(AddEditCategoryEvent.SetEditingCategory(editedCategoryId))
}

viewModel.onEvent(AddEditCategoryEvent.ViewLoaded)
}
}
< /code>
In der ViewModel -Klasse Ich wähle das Kategorieobjekt aus der Datenbank mithilfe der Suspend -Funktion aus. Und sobald es geladen ist, möchte ich Kinderkategorien nach der ID des übergeordneten Ladens laden. [url=viewtopic.php?t=14917]Ich möchte[/url] sie als StateFlow haben, weil ich sie aktualisieren und Änderungen des Bildschirms widerspiegeln möchte. Also habe ich versucht, es wie unten zu definieren: < /p>
private var activeChildCategories = MutableStateFlow(emptyList()).asStateFlow()
< /code>
Und sobald ich eine Antwort von der Suspend -Funktion erhalten habe, versuche ich, den folgenden Wert zuzuweisen: < /p>
activeChildCategories = categoryDao.selectActiveChildCategories(event.categoryId)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
< /code>
, um Änderungen später zu sammeln und die Benutzeroberfläche zu aktualisieren. Aber es gibt immer eine leere Zeichenfolge zurück, wie ich sehen kann. Keine Updates in der Benutzeroberfläche. Wie kann ich das gewünschte Verhalten erreichen?@HiltViewModel
class AddEditCategoryViewModel @Inject constructor(appDatabase: AppDatabase) : WhereIsMyMoneyViewModel() {

private val categoryDao = appDatabase.categoryDao()
private val activeCategories = categoryDao.selectActiveParentCategories()
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())

private var activeChildCategories = MutableStateFlow(emptyList()).asStateFlow()

private val _state = MutableStateFlow(AddEditCategoryState())

val state = combine(
_state,
activeCategories,
activeChildCategories
) { state, activeCategories, activeChildCategories ->
state.copy(
categories = activeCategories,
activeChildCategories = activeChildCategories,
)
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), AddEditCategoryState())

fun onEvent(event: AddEditCategoryEvent) {
when (event) {
is AddEditCategoryEvent.ViewLoaded -> {
_state.update { it.copy(viewLoaded = true) }
}

is AddEditCategoryEvent.SetEditingCategory -> {
launchCatching {
val category = categoryDao.selectCategoryById(event.categoryId)

_state.update {
it.copy(
selectedCategory = category,
colorLong = category.colorLong,
categoryName = category.name,
categoryType = category.type,
iconName = category.iconName,
)
}

activeChildCategories = categoryDao.selectActiveChildCategories(event.categoryId)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
}
}
}
}
}

< /code>
Dao: < /p>
@Dao
interface CategoryDao {
@Query("SELECT * FROM CATEGORY WHERE ARCHIVED = 0 AND PARENT_CATEGORY_ID IS NULL")
fun selectActiveParentCategories(): Flow

@Query("SELECT * FROM CATEGORY WHERE ARCHIVED = 0 AND PARENT_CATEGORY_ID = :id")
fun selectActiveChildCategories(id: Int): Flow

@Query("SELECT * FROM CATEGORY WHERE ID = :id")
suspend fun selectCategoryById(id: Int): Category
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post