gpt4 book ai didi

ViewModel 中的 Kotlin 高阶函数

转载 作者:行者123 更新时间:2023-12-02 12:53:02 27 4
gpt4 key购买 nike

我是 kotlin 的新手,所以需要帮助来理解代码,我去了一个博客,发现了类似的东西并在我的代码中实现了,代码工作完美,但我无法理解以下内容。

基本上,我迷失了 lazyDefferd 的功能,它在内部是如何工作的。
一种。泛型 T 是如何传递的。
b.这个 CoroutineScope.() 是什么意思,我知道这是我需要从 ViewModel 传递的输入,但我不明白它是如何传递的。

interface MovieRepository {
suspend fun getTopRatedMovie(page:Int): LiveData<out List<TopRatedMovieEntity>>
}

View 模型:

class TopRatedMovieViewModel(movieRepository: MovieRepository):ViewModel() {

val topMovie by lazyDefferd{
movieRepository.getTopRatedMovie(1)
}

}

fun <T> lazyDefferd(block:suspend CoroutineScope.()->T):Lazy<Deferred<T>>{
return lazy {
GlobalScope.async(start = CoroutineStart.LAZY) {
block.invoke(this)
}
}
}

最佳答案

a. How generic T is passed.

您可以显式传递它,例如:

val myLazyDeffered = lazyDefferd<SomeType> {
// …
}

但是编译器通常可以推断出类型,所以更常见的是省略它(除非代码中有不清楚的原因)。这就是您的 topMovie 示例中发生的情况:编译器知道 lambda 返回的类型,因此它从中推断出 T

(您可能已经注意到,lazyDefferd() 也有一个值参数,但由于它是最后一个参数和一个 lambda,Kotlin 允许您省略括号。)

b. What it mean by this CoroutineScope.()

那是一个 function literal with receiver .您传递给 block 的 lambda 将表现为 CoroutineScope 类的扩展方法:在 lambda 内部,this 将引用一个CoroutineScope 实例。它类似于将实例作为参数传递给 lambda(在这种情况下,它就是这样调用的),但语法更简洁。

关于ViewModel 中的 Kotlin 高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56648930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com