Изменить MutablEStateFlow после инициализации зависимого параметраAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Изменить MutablEStateFlow после инициализации зависимого параметра

Сообщение Anonymous »

Разработка приложения с использованием комнаты и сочинения. Я хочу достичь следующего: < /p>
Пользователь открывает экран A со списком родительских категорий. База данных: < /p>
LaunchedEffect(Unit) {
if (!state.viewLoaded) {
editedCategoryId?.let { editedCategoryId ->
viewModel.onEvent(AddEditCategoryEvent.SetEditingCategory(editedCategoryId))
}

viewModel.onEvent(AddEditCategoryEvent.ViewLoaded)
}
}
< /code>
В классе ViewModel I Выберите объект категории из базы данных, используя функцию приостановки. И как только он будет загружен, я хочу загрузить детские категории по идентификатору родителей. Я хочу, чтобы они были в качестве потока Stateflow, потому что я хочу обновить их и отразить изменения на экране. Поэтому я попытался определить его, как ниже: < /p>
private var activeChildCategories = MutableStateFlow(emptyList()).asStateFlow()
< /code>
И как только я получил ответ от функции приостановки, я пытаюсь переназначить следующее значение: < /p>
activeChildCategories = categoryDao.selectActiveChildCategories(event.categoryId)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
< /code>
для сбора изменений позже и обновить пользовательский интерфейс. Но это всегда возвращает пустую строку, как я вижу. Нет обновлений в пользовательском интерфейсе. Как я могу достичь желаемого поведения?@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
}


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

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

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

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

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

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