提问人:NewPartizal 提问时间:10/6/2023 最后编辑:NewPartizal 更新时间:10/9/2023 访问量:46
为什么我的 UI 更新在 kotlin jetpack compose 中没有?
Why isn't my UI update in kotlin jetpack compose?
问:
地图来自另一个屏幕,当我在该地图上进行删除时,地图中的数据将被删除,但由于没有UI更新,因此屏幕上没有更改,但是当我进行更改以更新UI时,例如,当我返回并返回时,它将被删除, 所以我意识到这是这种情况的迹象。我从列表中删除的元素被删除了,但由于没有 UI 更新,因此我无法在 UI 端看到更改。有没有我遗漏的部分?我找不到它。你能帮帮我吗?这是我的代码。
食物类别内容
这是来自另一个屏幕的可包数据
data class FoodItem(val id: Int?, val name: String?)
@Parcelize
data class FoodCategoryContent(
val selectedFoodList: @RawValue MutableMap<String, MutableSet<FoodItem>> = mutableMapOf()
):Parcelable
我的用户界面:
@Composable
fun FilteredResponseRoute(
navHostController: NavHostController,
foodFilterSearchResponse: FoodCategoryContent?,
viewModel: FilteredResponseViewModel = hiltViewModel()
) {
var doOnce by remember { mutableStateOf(true) }
if (doOnce && foodFilterSearchResponse != null) {
viewModel.saveTagList(foodFilterSearchResponse.selectedFoodList)
doOnce = false
}
val state by viewModel.state.collectAsState()
FilteredResponseScreen(
navHostController,
state,
removeTagList = viewModel::removeTagList
)
}
@Composable
fun FilteredResponseScreen(
navHostController: NavHostController,
state: FilteredResponseScreenState,
removeTagList: (FoodItem, String, Map<String, MutableSet<FoodItem>>) -> Unit
) {
...
if (state.selectedFilterItems.isNotEmpty()) {
Row(
modifier = Modifier
.fillMaxWidth()
.horizontalScroll(rememberScrollState())
) {
state.selectedFilterItems.forEach { tags ->
tags.value.forEach { tag ->
FilterCategories(
foodItem = tag,
key = tags.key,
remove = { removedFoodItem, categoryKey ->
removeTagList(
removedFoodItem,
categoryKey,
state.selectedFilterItems
)
}
)
}
}
}
}
...
我的视图模型:
@HiltViewModel
class FilteredResponseViewModel @Inject constructor() : ViewModel() {
private val _state = MutableStateFlow(FilteredResponseScreenState())
val state: StateFlow<FilteredResponseScreenState> = _state.asStateFlow()
fun saveTagList(tagList: Map<String, MutableSet<FoodItem>>) {
_state.update {
it.copy(
selectedFilterItems = tagList
)
}
}
fun removeTagList(
removedItem: FoodItem,
categoryKey: String,
selectedFilterList: Map<String, MutableSet<FoodItem>>
) {
val categorySet = selectedFilterList[categoryKey]
if (categorySet != null && categorySet.contains(removedItem)) {
categorySet.remove(removedItem)
_state.update { currentState ->
val updatedFilterList = currentState.selectedFilterItems.toMutableMap()
updatedFilterList[categoryKey] = categorySet
currentState.copy(selectedFilterItems = updatedFilterList)
}
}
}
}
data class FilteredResponseScreenState(
val isLoading: Boolean = false,
val error: Boolean = false,
val selectedFilterItems: Map<String, MutableSet<FoodItem>> = mutableMapOf(),
)
解决
为什么我有时会遇到这样的问题,但我是这样解决问题的
_state.value = state.value.copy(
tagList = newTagList,
)
我没有像这样更新了 state.update 值,它起作用了
答: 暂无答案
评论