У меня есть 7 объектов в комнате, и я хочу обновить имя одного элемента. Вот что я пробовал:
interface ItemDao {
@Query("SELECT * FROM item_table")
fun getItems(): Flow
@Update
fun updateItem(item: Item)
}
Мой репозиторий очень простой:
interface ItemRepository {
fun getItems(): Flow
fun updateItem(item: Item)
}
Внутри ViewModel у меня есть:
class ItemsViewModel @Inject constructor(
private val repo: ItemRepository
) : ViewModel() {
val itemsResultFlow = flow {
repo.getItems().collect { items ->
try {
emit(Result.Success(items))
} catch (e: Exception) {
emit(Result.Failure(e))
}
}
}
var updateItemResult by mutableStateOf(Result.Loading)
private set
fun updateItem(item: Item) = viewModelScope.launch {
updateItemResult = try {
Result.Success(repo.updateItem(item))
} catch (e: Exception) {
Result.Failure(e)
}
}
}
И внутри составного элемента у меня есть:
val itemsResponse by viewModel.itemsResultFlow.collectAsStateWithLifecycle(Result.Loading)
Scaffold(
topBar = {
//
},
content = {
when(val itemsResponse = itemsResponse) {
is Result.Loading -> CircularProgressIndicator()
is Result.Success -> {
items(
items = itemsResponse.data
) { item ->
Text(item.name)
}
}
is Result.Error -> print(result.e)
}
}
)
Приложение работает нормально, но загружает весь список элементов каждый раз, когда я обновляю один элемент, а это не то, что мне нужно. Чтобы избавиться от этого, я внес некоторые изменения в ViewModel:
private var _items = MutableStateFlow(Result.Loading)
val items: StateFlow = _items.asStateFlow()
init {
viewModelScope.launch {
repo.getItems().collect { items ->
try {
_items.value = Response.Success(items)
} catch (e: Exception) {
_items.value = Response.Failure(e)
}
}
}
}
И внутри составного элемента:
val itemsResponse by viewModel.items.collectAsState()
Приложение компилируется без ошибок, но когда я обновляю имя элемента, я не вижу обновленное имя в списке, пока не закрою и не открою приложение снова. Как увидеть обновленное значение в списке без необходимости загрузки всего списка элементов?
Обновить
Вот вызов в классе репо:
fun getItems(): Flow
А вот вызов в классе реализации репо:
override fun getItems() = itemDao.getItems()
Подробнее здесь: https://stackoverflow.com/questions/791 ... -an-update
Как распространить изменения из комнаты при выполнении обновления? ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1730973928
Anonymous
У меня есть 7 объектов в комнате, и я хочу обновить имя одного элемента. Вот что я пробовал:
interface ItemDao {
@Query("SELECT * FROM item_table")
fun getItems(): Flow
@Update
fun updateItem(item: Item)
}
Мой репозиторий очень простой:
interface ItemRepository {
fun getItems(): Flow
fun updateItem(item: Item)
}
Внутри ViewModel у меня есть:
class ItemsViewModel @Inject constructor(
private val repo: ItemRepository
) : ViewModel() {
val itemsResultFlow = flow {
repo.getItems().collect { items ->
try {
emit(Result.Success(items))
} catch (e: Exception) {
emit(Result.Failure(e))
}
}
}
var updateItemResult by mutableStateOf(Result.Loading)
private set
fun updateItem(item: Item) = viewModelScope.launch {
updateItemResult = try {
Result.Success(repo.updateItem(item))
} catch (e: Exception) {
Result.Failure(e)
}
}
}
И внутри составного элемента у меня есть:
val itemsResponse by viewModel.itemsResultFlow.collectAsStateWithLifecycle(Result.Loading)
Scaffold(
topBar = {
//
},
content = {
when(val itemsResponse = itemsResponse) {
is Result.Loading -> CircularProgressIndicator()
is Result.Success -> {
items(
items = itemsResponse.data
) { item ->
Text(item.name)
}
}
is Result.Error -> print(result.e)
}
}
)
Приложение работает нормально, но загружает [b]весь список элементов[/b] каждый раз, когда я обновляю один элемент, а это не то, что мне нужно. Чтобы избавиться от этого, я внес некоторые изменения в ViewModel:
private var _items = MutableStateFlow(Result.Loading)
val items: StateFlow = _items.asStateFlow()
init {
viewModelScope.launch {
repo.getItems().collect { items ->
try {
_items.value = Response.Success(items)
} catch (e: Exception) {
_items.value = Response.Failure(e)
}
}
}
}
И внутри составного элемента:
val itemsResponse by viewModel.items.collectAsState()
Приложение компилируется без ошибок, но когда я обновляю имя элемента, я не вижу обновленное имя в списке, пока не закрою и не открою приложение снова. Как увидеть обновленное значение в списке без необходимости загрузки всего списка элементов?
[b]Обновить[/b]
Вот вызов в классе репо:
fun getItems(): Flow
А вот вызов в классе реализации репо:
override fun getItems() = itemDao.getItems()
Подробнее здесь: [url]https://stackoverflow.com/questions/79162005/how-to-propagate-the-changes-from-room-when-i-perform-an-update[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия