что означает :: MainViewModel при передаче в singleArgViewModelFactory - PullRequest
1 голос
/ 15 мая 2019

в лаборатории kotlin сопрограмм smaple, https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#6

он создает viewModel, передавая MainViewModel.FACTORY(repository)

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

MainViewModel, как показано ниже, не понимаю, какой синтаксис ::MainViewModel используется в

val FACTORY = singleArgViewModelFactory(::MainViewModel)

singleArgViewModelFactory имеет конструктор:

singleArgViewModelFactory(constructor: (A) -> T)

, который принимает функцию (A) -> T, что означает ::MainViewModel в singleArgViewModelFactory(::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
            }
        }
    }
}

1 Ответ

2 голосов
/ 15 мая 2019

::MainViewModel является ссылкой функции .Для параметра типа (A) -> T это, в основном, ссылка на функцию (в данном случае конструктор), которая принимает параметр типа A и доставляет T (который в данном случае сам MainViewModel).

Сравнение ссылки с ее фактическим аналогом:

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