Я делаю небольшое приложение для сохранения моей коллекции записей, у меня есть строка поиска, менубар с тремя категориями, и у каждой записи есть кнопка, чтобы добавить к коллекции, и один для добавления в список желаний, я стараюсь обновить пользовательский интерфейс в моем просмотре, в поисковой панели и Menubar, но кнопки не обновляются (пустое сердце, когда запись не в списке желаний и заполненные сердца, когда он есть).
data class RecordsAppUiState(
val records : Flow,
val searchValue : String,
val category: Category = Category.ALL,
)
class RecordAppViewModel(var context : Context) : ViewModel() {
private var repository : LocalRecordsRepository = LocalKitsRepository(RecordAppDatabase.getDatabase(context).recordDao())
private var recordsInDatabase = repository.getAllRecordsStream()
private var currentCategory = Category.ALL
private var currentChange = false
private val _uiState : MutableStateFlow =
MutableStateFlow(
RecordsAppUiState(
records = recordsInDatabase,
searchValue = "",
)
)
fun onSearchValueChanged(newSearchValue : String) {
_uiState.value = _uiState.value.copy(
searchValue = newSearchValue,
records = recordsInDatabase.map { records -> records.filter {
record -> (record.name.contains(newSearchValue, ignoreCase = true))
}
},
category = currentCategory
)
}
// Adds the record to the wishlist
fun addRecordToUserWishlist(record : Record) {
record.IsInWishlist = !record.IsInWishlist
viewModelScope.launch(Dispatchers.IO) {
repository.updateRecord(record)
}
_uiState.value = _uiState.value.copy(
records =
recordsInDatabase.map { listRecords ->
listRecords.map { oldRecord -> if (oldRecord.uid == record.uid) oldRecord.copy(IsInWishlist = record.IsInWishlist) else oldRecord }
},
)
}
< /code>
OnsearchValueChanged Обновления моего списка напрямую, но я должен заставить переоборудование (затем прокрутите вниз), чтобы увидеть изменение кнопок с помощью AddRecordTouserWishList.@Composable
fun RecordAppCard(
record : record,
addWishlistClicked : (record) -> Unit,
){
Card {
Text(
text = "Record 1",
)
Row {
IconButton(onClick = {
addWishlistClicked(record) // Calls addRecordToUserWishlist from viewModel above
}){
Icon(
imageVector = if (record.IsInWishlist) Icons.Default.Favorite else Icons.Default.FavoriteBorder,
contentDescription = stringResource(R.string.add_wishlist, record.name),
)
}
}
}
}
< /code>
А вот основной экран, где у меня есть список записей: < /p>
fun RecordAppsMainScreen(
modifier : Modifier = Modifier,
viewModel: RecordAppViewModel = viewModel()
) {
val uiState = viewModel.uiState.collectAsStateWithLifecycle()
val flowRecords = uiState.value.records
val listRecords = flowRecords.collectAsState(initial = emptyList()).value
LazyColumn (
verticalArrangement = Arrangement.spacedBy(4.dp),
){
item {
RecordAppSearchBar(
searchValue = uiState.value.searchValue,
onSearchChange = { viewModel.onSearchValueChanged(it)}
)
}
items (listRecords) { record ->
RecordAppCard(
record = record,
addWishlistClicked = { viewModel.addRecordToUserWishlist(record) },
)
}
}
}
< /code>
Я также попробовал другой способ, где я добавил переменную в композиционную функцию recordappcard: < /p>
var inWishlist by remember { mutableStateOf(kit.IsInWishlist) }
Это «работает», как и в Iconbutton напрямую обновляется, но если я прокручиваю вниз, у меня начинаю возникнуть такие проблемы, как заполненные значки, когда они не должны быть, поэтому я не уверен, что это правильный путь. Спасибо!
Я делаю небольшое приложение для сохранения моей коллекции записей, у меня есть строка поиска, менубар с тремя категориями, и у каждой записи есть кнопка, чтобы добавить к коллекции, и один для добавления в список желаний, я стараюсь обновить пользовательский интерфейс в моем просмотре, в поисковой панели и Menubar, но кнопки не обновляются (пустое сердце, когда запись не в списке желаний и заполненные сердца, когда он есть).[code]data class RecordsAppUiState( val records : Flow, val searchValue : String, val category: Category = Category.ALL, )
class RecordAppViewModel(var context : Context) : ViewModel() { private var repository : LocalRecordsRepository = LocalKitsRepository(RecordAppDatabase.getDatabase(context).recordDao()) private var recordsInDatabase = repository.getAllRecordsStream() private var currentCategory = Category.ALL private var currentChange = false private val _uiState : MutableStateFlow = MutableStateFlow( RecordsAppUiState( records = recordsInDatabase, searchValue = "", ) )
fun onSearchValueChanged(newSearchValue : String) { _uiState.value = _uiState.value.copy( searchValue = newSearchValue, records = recordsInDatabase.map { records -> records.filter { record -> (record.name.contains(newSearchValue, ignoreCase = true)) } }, category = currentCategory ) }
// Adds the record to the wishlist fun addRecordToUserWishlist(record : Record) { record.IsInWishlist = !record.IsInWishlist viewModelScope.launch(Dispatchers.IO) { repository.updateRecord(record) } _uiState.value = _uiState.value.copy( records = recordsInDatabase.map { listRecords -> listRecords.map { oldRecord -> if (oldRecord.uid == record.uid) oldRecord.copy(IsInWishlist = record.IsInWishlist) else oldRecord } }, ) } < /code> OnsearchValueChanged Обновления моего списка напрямую, но я должен заставить переоборудование (затем прокрутите вниз), чтобы увидеть изменение кнопок с помощью AddRecordTouserWishList.@Composable fun RecordAppCard( record : record, addWishlistClicked : (record) -> Unit, ){
Card { Text( text = "Record 1", )
Row { IconButton(onClick = { addWishlistClicked(record) // Calls addRecordToUserWishlist from viewModel above }){ Icon( imageVector = if (record.IsInWishlist) Icons.Default.Favorite else Icons.Default.FavoriteBorder, contentDescription = stringResource(R.string.add_wishlist, record.name), ) } } } } < /code> А вот основной экран, где у меня есть список записей: < /p> fun RecordAppsMainScreen( modifier : Modifier = Modifier, viewModel: RecordAppViewModel = viewModel() ) { val uiState = viewModel.uiState.collectAsStateWithLifecycle() val flowRecords = uiState.value.records val listRecords = flowRecords.collectAsState(initial = emptyList()).value
LazyColumn ( verticalArrangement = Arrangement.spacedBy(4.dp), ){ item { RecordAppSearchBar( searchValue = uiState.value.searchValue, onSearchChange = { viewModel.onSearchValueChanged(it)} ) } items (listRecords) { record -> RecordAppCard( record = record, addWishlistClicked = { viewModel.addRecordToUserWishlist(record) }, ) } } } < /code> Я также попробовал другой способ, где я добавил переменную в композиционную функцию recordappcard: < /p> var inWishlist by remember { mutableStateOf(kit.IsInWishlist) }[/code] Это «работает», как и в Iconbutton напрямую обновляется, но если я прокручиваю вниз, у меня начинаю возникнуть такие проблемы, как заполненные значки, когда они не должны быть, поэтому я не уверен, что это правильный путь. Спасибо!