ViewModel中的Kotlin高阶函数

时间:2019-06-18 12:14:35

标签: kotlin kotlin-coroutines

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

基本上,我对 lazyDefferd 函数的工作方式以及内部工作原理一无所知。
一种。通用T的传递方式。
b。 CoroutineScope.()的含义是什么,因为我知道这是我需要从ViewModel传递过来的输入,但是我不明白它是如何传递的。

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

ViewModel:

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

1 个答案:

答案 0 :(得分:1)

  

a。通用T的传递方式。

您可以明确地传递它,例如:

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

但是编译器通常可以推断出类型,因此更通常地忽略它(除非出于某种原因,从代码中看不出来)。这就是您的topMovie示例中发生的事情:编译器知道lambda返回的类型,因此可以从中推断出T

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

  

b。 CoroutineScope.()

是什么意思

那是function literal with receiver。传递给block的lambda的行为就好像是CoroutineScope类的扩展方法:在lambda中,this将引用一个CoroutineScope实例。类似于将实例作为参数传递给lambda(在这种情况下,就是这样),但是语法更加简洁。