在状态更改时更新单个 LazyColumn 项

Updating a single LazyColumn item on state changes

提问人:Илья Жиленков 提问时间:11/13/2023 更新时间:11/13/2023 访问量:45

问:

我需要在我的项目中显示最喜欢的会话,但是如果收藏夹会话列出了 cahnges,要更新我需要向下滚动的内容,而顶部完全消失,然后返回我的.LazyRowLazyColumnLazyRowLazyRowLazyRow

这是我的代码:

@Composable
fun SessionsScreen(onSessionClick: (Session) -> Unit, viewModel: SessionsViewModel = 
hiltViewModel()) {
    val sessionsStateFlow by viewModel.sessionsStateFlow.collectAsState()
    val favouriteStateFlow by viewModel.favouritesStateFlow.collectAsState()

    LazyColumn(
        modifier = Modifier
            .padding(horizontal = 20.dp)
            .fillMaxSize()
    ) {
        favourite(favouriteStateFlow)
    }
}


fun LazyListScope.favourite(favouritesState: List<Session>) {
    item {
        LazyRow {
            if (favouritesState.isEmpty()) {
                item { Text(text = stringResource(id = R.string.no_favourites)) }
            }
            items(favouritesState) {
                Favourite(it)
            }
        }
    }
}
人造人 科特林 android-jetpack-compose 安卓喷气背包 lazycolumn

评论

0赞 JanItor 11/14/2023
你能在你的中展示实现,你如何修改它吗?favouriteStateFlowviewModel
0赞 Илья Жиленков 11/16/2023
我已经解决了这个问题。问题是我不更改对象本身,我只是在列表中再添加一个项目。favouritesStateFlow

答:

0赞 NewPartizal 11/13/2023 #1

若要在收藏夹会话列表更改时更新 LazyRow 中的内容,应使用 items 函数中的 key 参数。这确保了 Compose 可以区分不同的项目并正确更新它们。

    @Composable
    fun SessionsScreen(onSessionClick: (Session) -> Unit, viewModel: SessionsViewModel = hiltViewModel()) {
        val sessionsStateFlow by viewModel.sessionsStateFlow.collectAsState()
        val favouriteStateFlow by viewModel.favouritesStateFlow.collectAsState()
    
        LazyColumn(
            modifier = Modifier
                .padding(horizontal = 20.dp)
                .fillMaxSize()
        ) {
            favourite(favouriteStateFlow)
        }
    }
    
    fun LazyListScope.favourite(favouritesState: List<Session>) {
        item {
            LazyRow {
                if (favouritesState.isEmpty()) {
                    item { Text(text = stringResource(id = R.string.no_favourites)) }
                }
                items(favouritesState) { session ->
                    Favourite(session, key = session.id) {
                        // Add any interaction logic here
                    }
                }
            }
        }
    }
    
    @Composable
    fun Favourite(session: Session, onClick: () -> Unit) {
        // Your Favourite item composable content here
        // For example:
        Box(
            modifier = Modifier
                .padding(8.dp)
                .clickable { onClick() }
        ) {
            Text(text = session.title)
        }

}

评论

0赞 Илья Жиленков 11/13/2023
这并不能解决我的问题,因为它为 的函数提供了键,问题是不要更新作为根的项目LazyRowitemsLazyColumnfun LazyListScopre.favourites()