App mit Raum entwickeln und komponieren. Ich möchte Folgendes erreichen: < /p>
Der Benutzer öffnet Bildschirm A mit Liste der übergeordneten Kategorien. Datenbank: < /p>
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
}
App mit Raum entwickeln und komponieren. [url=viewtopic.php?t=14917]Ich möchte[/url] Folgendes erreichen: < /p> Der Benutzer öffnet Bildschirm A mit Liste der übergeordneten Kategorien. Datenbank: < /p> [code] 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())
< /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 } [/code]
Ich habe ein Problem mit meinem 2 Level -abhängigen Dropdown. .jpg
Nachdem ich Daten in die Selektoren eingegeben habe, bin ich auf eine andere Seite gebracht, aber nachdem ich zu den vorherigen...
Ich versuche (aus esoterischen Gründen, dass ich hier nicht diskutieren möchte), eine Klassenvorlage zu schreiben, deren Instanziationen Mitglieder haben, die entweder Funktionen oder Variablen...
Ich lerne Kotlin Flow und konvertierende Code in meiner Unternehmens -App von LiveLiveata in Kotlin Flow. Ich habe also die Frage:
In meinem ViewModel hatte ich Variable Status wie folgt gelebt:...
Ich lerne Kotlin Flow und konvertierende Code in meiner Unternehmens -App von LiveLiveata in Kotlin Flow. Ich habe also die Frage:
In meinem ViewModel hatte ich Variable Status wie folgt gelebt:...
Gibt es eine Möglichkeit, einen mutablestateFlow mit Daten aus der Datenbank zu initiieren? Ich habe den folgenden Ansatz ausprobiert, aber der RecordedActivityUistate wird nicht mit dem Objekt aus...