Как распространить изменения из комнаты при выполнении обновления?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как распространить изменения из комнаты при выполнении обновления?

Сообщение 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)
}
}
)

Приложение работает нормально, но загружает весь список элементов каждый раз, когда я обновляю один элемент, а это не то, что мне нужно. Чтобы избавиться от этого, я внес некоторые изменения в 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
Ответить

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

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

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

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

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