Разработка приложения с использованием комнаты и сочинения. Я хочу достичь следующего: < /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
Изменить MutablEStateFlow после инициализации зависимого параметра ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1757892767
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
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79764510/change-mutablestateflow-after-dependent-parameter-initialization[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия