android - 当传递给 singleArgViewModelFactory 时::MainViewModel 意味着什么

标签 android kotlin android-viewmodel android-architecture-lifecycle

在 kotlin 协程实验室 smaple 中,https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#6

它通过传递MainViewModel.FACTORY(repository)来创建viewModel

val viewModel = ViewModelProviders
    .of(this, MainViewModel.FACTORY(repository))
    .get(MainViewModel::class.java)

MainViewModel如下,不明白::MainViewModel使用的是什么语法

val FACTORY = singleArgViewModelFactory(::MainViewModel)

singleArgViewModelFactory 有构造函数:

singleArgViewModelFactory(constructor: (A) -> T)

它采用函数(A) -> TsingleArgViewModelFactory(::MainViewModel)中的::MainViewModel是什么意思?

class MainViewModel(private val repository: TitleRepository) : ViewModel() {

    companion object {
        /**
         * Factory for creating [MainViewModel]
         *
         * @param arg the repository to pass to [MainViewModel]
         */
        val FACTORY = singleArgViewModelFactory(::MainViewModel)
    }


    ......
}



fun <T : ViewModel, A> singleArgViewModelFactory(constructor: (A) -> T):
        (A) -> ViewModelProvider.NewInstanceFactory {
    return { arg: A ->
        object : ViewModelProvider.NewInstanceFactory() {
            @Suppress("UNCHECKED_CAST")
            override fun <V : ViewModel> create(modelClass: Class<V>): V {
                return constructor(arg) as V
            }
        }
    }
}

最佳答案

::MainViewModelfunction reference 。对于 (A) -> T 类型的参数,它基本上是对接受 A 类型的参数并传递 的函数(在本例中为构造函数)的引用>T(在本例中是 MainViewModel 本身)。

将引用与实际对应物进行比较:

val ref : (A) -> T = ::MainViewModel
val ref : (A) -> T = { MainViewModel(it) } // or: = { anA : A -> MainViewModel(anA) }

关于android - 当传递给 singleArgViewModelFactory 时::MainViewModel 意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56151362/

相关文章:

Android在 fragment 和对话框 fragment 之间共享ViewModel?

android - Bindable 必须在 Observable 类的成员上

java - Media Recorder 在 Android 中启动失败,用于三星 Galaxy s3 的前置摄像头

android - RTL-Layout 中忽略准则(Android Constraint-Layout)

android - 直接在 flutter 项目中使用插件,无需分离到另一个包或在 pubspec.yaml 中添加插件字段

maven - Kotlin-无法在intellij中运行 “hello world”

java - gson.toJson返回数据类的空对象

android - AndEngine 混淆注销 IUpdateHandler

android - 将 constraintlayout 元素显示为 recyclerview 项目

android - 使用导航组件将 View 模型限定为多个 fragment (不是 Activity )