【发布时间】:2021-09-11 13:39:37
【问题描述】:
我有一个 ViewModel 可以生成这样的 StateFlow:
private val _profiles = MutableStateFlow<List<ProfileSnap>>(listOf())
val profiles: StateFlow<List<ProfileSnap>>
get() = _profiles
值在另一个有趣的地方更新:
private fun loadProfiles() = viewModelScope.launch {
_profiles.value = profileDao.getAll(profilesSearch, profilesSort)
}
最后,在 Compose 中列出所有值(这是我的代码的简化版本):
@Composable
fun SetContent(viewModel: ProfilesViewModel){
val profiles = viewModel.profiles.collectAsState()
LazyColumn(
modifier = Modifier
.fillMaxHeight()
) {
itemsIndexed(items = profiles.value) { _, profile ->
Text(
text = "(${profile.profileId}) ${profile.label}",
modifier = Modifier
.pointerInput(Unit) {
detectTapGestures(
onLongPress = {
Log.d(TAG, "onLongPress: ${profile.profileId}")
},
onTap = {
Log.d(TAG, "onTap: ${profile.profileId}")
},
)
}
)
}
}
}
一开始,当我到达列表片段并单击一个元素时,我得到了正确的对应profileId。但是,当我应用过滤器或更改列表排序并调用 loadProfiles() 函数时:
- 列表会根据新过滤和/排序的配置文件正确更改
- 当我单击某个元素时,我得到了错误的 profileId,我似乎是以前的列表配置之一!
我做错了什么?配置文件不是最新的?但如果它们没有更新,为什么列表是“图形”正确的?这里会发生什么:
(1) A
-----
(2) B
-----
(3) C <== CLICK - onTap: 3 / LONGPRESS - onLongPress: 3
更改排序顺序:
(3) C
-----
(2) B
-----
(1) A <== CLICK - onTap: 3 [should has been 1] / LONGPRESS - onLongPress: 3 [should has been 1]
非常感谢
【问题讨论】:
标签: android kotlin android-jetpack-compose kotlin-flow