android 不更新mutableStateListOf< String>()

tf7tbtn2  于 2023-04-04  发布在  Android
关注(0)|答案(2)|浏览(146)

我试图在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不调用。
如果我说错了请纠正我

8tntrjer

8tntrjer1#

最后我发现我犯了一个错误
我把代码从

LaunchedEffect(searchedTopicList) {
        newsViewModel.getNewsFromTopics(searchedTopicList)
}

LaunchedEffect(searchedTopicList.size) {
            newsViewModel.getNewsFromTopics(searchedTopicList)
    }

因此,每当searchedTopicList大小更改时,LaunchedEffect就会再次触发并调用Make API。
对于log,我添加了size,然后日志显示
如果有人想参加一些光对它那么这将是一个伟大的

pgpifvop

pgpifvop2#

如果你需要在不改变列表大小的情况下处理改变列表的操作,你的答案就不起作用了。

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")
   }

因为compose只观察列表的size而不是list的变化。
您的代码需要从

LaunchedEffect(searchedTopicList.size) {

    newsViewModel.getNewsFromTopics(searchedTopicList)
 }

一个在上面,一个在下面。

  1. snapShotFlow创建readObserver,它收集主体内部观察到的状态变化,并将其作为Flow发出。searchedTopicList.toList()实际上是从StateRecord阅读状态。从collectLastest收集的每个事件都会取消以前的newsViewModel.getNewsFromTopics,并在可能的情况下启动新的newsViewModel.getNewsFromTopics
LaunchedEffect(searchedTopicList) {
    snapShotFlow{ searchedTopicList.toList() }.collectLastest {
       newsViewModel.getNewsFromTopics(it)      
    }
 }

1.直接读取状态并将其作为密钥传递。

LaunchedEffect(searchedTopicList.toList()) {
    newsViewModel.getNewsFromTopics(searchedTopicList)
 }

相关问题