【问题标题】:what does the ::MainViewModel mean when pass to the singleArgViewModelFactory传递给 singleArgViewModelFactory 时 ::MainViewModel 是什么意思
【发布时间】:2019-05-15 14:08:28
【问题描述】:

在 kotlin coroutines 实验室样本中,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
            }
        }
    }
}

【问题讨论】:

  • 很可能是对类的构造函数的函数引用。
  • @CommonsWare,还有EpicPandaForce,谢谢大家帮忙快速指点解释!

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


【解决方案1】:

::MainViewModel 是一个function reference。对于(A) -&gt; T 类型的参数,它基本上是对接受A 类型参数并提供T 的函数(在这种情况下为构造函数)的引用(在这种情况下是MainViewModel 本身)。

将参考与实际对应物进行比较:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多