Android JetPack Compose 使用Room Flow的一些小坑
引言 在写一个小的Android Compose App时, 遇到了一个小问题 先看下行为 你的浏览器不支持视频标签. 我的收藏列表是根据收藏名称从数据库查询到的(不要问为什么这么建立数据库, 我也知道是屎山, 这里只探讨这个Flow的行为), 可以看到, 在我们更新了收藏的名称之后, 收藏列表消失了. 其中收藏列表的渲染由FavorItem(selectedFavorItemListInTmp)实现. 具体获取收藏列表实现如下 @OptIn(ExperimentalMaterial3Api::class) @Composable fun AddFavorScreen( queryUserViewModel: QueryUserViewModel, ) { val selectedFavorItemList by queryUserViewModel.selectedFavorItemList.collectAsState() var selectedFavorItemListInTmp by remember(selectedFavorItemList) {mutableStateOf(selectedFavorItemList)} val favorName by queryUserViewModel.favorName.collectAsState() var favorNameTmp by remember(favorName) { mutableStateOf(favorNameFromOtherPage ?: favorName) } LaunchedEffect(Unit) {queryUserViewModel.queryFavorItems()} //Some code change favorNameTmp Button(onClick = { queryUserViewModel.saveUserFavor( selectedFavorItemListInTmp, favorNameTmp, remarkTmp ); }) { Text("保存") } FavorItem(selectedFavorItemListInTmp) } @Composable fun FavorItem(userList: List<ItemDetailState>) { ... } class QueryUserViewModel(){ val favorName = MutableStateFlow("") val remark = MutableStateFlow("") val selectedFavorItemList = MutableStateFlow<List<ItemDetailState>>(emptyList()) fun queryFavorItems() { val favorName = favorName.value viewModelScope.launch { remark.value = UserFavorRepository.queryFavorRemark(favorName) ?: "" UserFavorRepository.queryFavorItems(favorName).collect { user -> selectedFavorItemList.value = user.map { UserDataClassToItemDetailState(it) } }} _queryState.value = SaveState.Success } fun saveUserFavor( selectedFavorItemList: List<ItemDetailState>, favorName: String, favorRemark: String ) { viewModelScope.launch { UserFavorRepository.saveUserFavor(selectedFavorItemList, favorName, favorRemark) } } } 原因 为什么收藏列表为空? 我们使用的数据库为SQLite, 兼容层为Room ...