为什么我的 UI 更新在 kotlin jetpack compose 中没有?

Why isn't my UI update in kotlin jetpack compose?

提问人:NewPartizal 提问时间:10/6/2023 最后编辑:NewPartizal 更新时间:10/9/2023 访问量:46

问:

地图来自另一个屏幕,当我在该地图上进行删除时,地图中的数据将被删除,但由于没有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 值,它起作用了

Android Kotlin android-jetpack-compose 可打包 compose-recomposition

评论


答: 暂无答案