我试图在compose中从mutableStateList()中更新(添加或删除主题),但数据没有更新,
我想要的是我想要基于我想要做api调用的主题。
让我给你看看我做了什么
val searchedTopicList = remember {
mutableStateListOf<String>()
}
Log.i("Topics", "DashboardPersonalScreen: $searchedTopicList")
LaunchedEffect(searchedTopicList) {
newsViewModel.getNewsFromTopics(searchedTopicList)
}
Button(onClick ={
searchedTopicList.add("cars")
}){
Text("Add Topic")
}
当我点击按钮时,数据没有更新,这就是api没有调用的原因。
如果我错了,请纠正我
最后我发现了我犯的错误,
我更改了的代码
LaunchedEffect(searchedTopicList) {
newsViewModel.getNewsFromTopics(searchedTopicList)
}
至
LaunchedEffect(searchedTopicList.size) {
newsViewModel.getNewsFromTopics(searchedTopicList)
}
因此,每当searchedTopicList
大小改变时,LaunchedEffect
再次触发并进行API调用。
对于log
,我添加了size
,然后日志显示
如果有人想参加一些关于它的活动,那么这将是一个很棒的
如果您需要处理在不更改列表大小的情况下更改列表的操作,那么您的答案将不起作用。如下图所示。
val searchedTopicList = remember {
mutableStateListOf<String>()
}
Log.i("Topics", "DashboardPersonalScreen: $searchedTopicList")
LaunchedEffect(searchedTopicList.size) {
newsViewModel.getNewsFromTopics(searchedTopicList)
}
Button(onClick ={
if (searchedTopicList.isEmpty()) {
searchedTopicList.add("cars")
} else {
searchedTopicList[searchedTopicList.lastIndex] = UUID().toString()
}
}){
Text("Add Topic")
}
因为组成只观察列表的CCD_ 5而不观察CCD_。
您的代码需要从更改
LaunchedEffect(searchedTopicList.size) {
newsViewModel.getNewsFromTopics(searchedTopicList)
}
到下面的一个。
snapShotFlow
创建readObserver,收集身体内部观察到的状态变化并将其作为Flow
发出。CCD_ 9实际上是从其CCD_。从collectLastest
收集的每个事件都将取消以前的newsViewModel.getNewsFromTopics
,并在可能的情况下启动新的事件
LaunchedEffect(searchedTopicList) {
snapShotFlow{ searchedTopicList.toList() }.collectLastest {
newsViewModel.getNewsFromTopics(it)
}
}
- 直接读取状态并将其作为密钥传递
LaunchedEffect(searchedTopicList.toList()) {
newsViewModel.getNewsFromTopics(searchedTopicList)
}