我试图建立一个应用程序与jetpack组成,但当它来到API调用与视图模型我得到一个无限循环.该应用程序不断调用api,我不明白为什么.这里是我的视图模型:
class LibraryViewModel() : ViewModel() {
var library: ArrayList<PKIssue> = arrayListOf()
var loadLibrary by mutableStateOf(false)
init {
getLibrary()
}
fun getLibrary(){
viewModelScope.launch {
Press.issues(
result = object : result<ArrayList<Issue>, Error> {
override fun succeed(result: ArrayList<Issue>?) {
loadLibrary = true
if (result != null) {
library = result
}
}
override fun failed(error: Error?) {
loadLibrary = false
}
})
}
}
但是一旦我初始化了我的viewModel,我就得到了对我的API的无限调用,下面是我尝试声明它的方法:
@SuppressLint("StateFlowValueCalledInComposition")
@Destination
@Composable
fun HomeScreen(
navigator: DestinationsNavigator,
libraryViewModel: LibraryViewModel = LibraryViewModel()
) {
或在可组合的:val libraryViewModel = LibraryViewModel()
但我得到了同样的问题,我是我错过了什么?它似乎是等待结束的API调用,使loadLibrary为真,但在同一时间,它保持调用getLibrary()在循环中。谢谢帮助
1条答案
按热度按时间8i9zcol21#
当您使用
每次该方法重组时,您都直接构造了一个全新的
LibraryViewModel
示例,因为您可能在getLibrary
返回时读取了loadLibrary
值,这将导致该方法的重组,从而导致无限循环(因为重组再次导致创建另一个全新的示例......这将启动加载......这将导致另一次重组)。相反,您应该遵循有关将ViewModels与Compose结合使用的文档:
1.将
androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
依赖项添加到build.gradle
文件1.使用
viewModel()
方法示例化ViewModel。viewModel()
方法实际上是在重构、导航到不同的屏幕以及配置更改过程中缓存和存储ViewModel的方法。由于使用该方法,您将只有该ViewModel的单个示例,因此不会运行相同的无限循环。