kotlin 无限循环中使用viewModel的Jetpack组合API调用

cczfrluj  于 2023-01-31  发布在  Kotlin
关注(0)|答案(1)|浏览(142)

我试图建立一个应用程序与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()在循环中。谢谢帮助

8i9zcol2

8i9zcol21#

当您使用

libraryViewModel: LibraryViewModel = LibraryViewModel()

每次该方法重组时,您都直接构造了一个全新的LibraryViewModel示例,因为您可能在getLibrary返回时读取了loadLibrary值,这将导致该方法的重组,从而导致无限循环(因为重组再次导致创建另一个全新的示例......这将启动加载......这将导致另一次重组)。
相反,您应该遵循有关将ViewModels与Compose结合使用的文档:
1.将androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1依赖项添加到build.gradle文件
1.使用viewModel()方法示例化ViewModel。

fun HomeScreen(
    navigator: DestinationsNavigator,
   libraryViewModel: LibraryViewModel = viewModel()
) {

viewModel()方法实际上是在重构、导航到不同的屏幕以及配置更改过程中缓存和存储ViewModel的方法。由于使用该方法,您将只有该ViewModel的单个示例,因此不会运行相同的无限循环。

相关问题