In our codebase there is a ViewModel that contains 23 dependencies (I know..) which could be injected just fine with 22 previously through Koin's viewModelOf(::YourVM)
. After one more was added, we seem to be getting the following compile-time error:
e: file:.../KoinModule.kt:73:5 None of the following functions can be called with the arguments supplied:
public inline fun <reified R : ViewModel> Module.viewModelOf(crossinline constructor: () -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1> Module.viewModelOf(crossinline constructor: (TypeVariable(T1)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14), TypeVariable(T15)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14), TypeVariable(T15), TypeVariable(T16)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16, reified T17> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14), TypeVariable(T15), TypeVariable(T16), TypeVariable(T17)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16, reified T17, reified T18> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14), TypeVariable(T15), TypeVariable(T16), TypeVariable(T17), TypeVariable(T18)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16, reified T17, reified T18, reified T19> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14), TypeVariable(T15), TypeVariable(T16), TypeVariable(T17), TypeVariable(T18), TypeVariable(T19)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16, reified T17, reified T18, reified T19, reified T20> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14), TypeVariable(T15), TypeVariable(T16), TypeVariable(T17), TypeVariable(T18), TypeVariable(T19), TypeVariable(T20)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16, reified T17, reified T18, reified T19, reified T20, reified T21> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14), TypeVariable(T15), TypeVariable(T16), TypeVariable(T17), TypeVariable(T18), TypeVariable(T19), TypeVariable(T20), TypeVariable(T21)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
public inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16, reified T17, reified T18, reified T19, reified T20, reified T21, reified T22> Module.viewModelOf(crossinline constructor: (TypeVariable(T1), TypeVariable(T2), TypeVariable(T3), TypeVariable(T4), TypeVariable(T5), TypeVariable(T6), TypeVariable(T7), TypeVariable(T8), TypeVariable(T9), TypeVariable(T10), TypeVariable(T11), TypeVariable(T12), TypeVariable(T13), TypeVariable(T14), TypeVariable(T15), TypeVariable(T16), TypeVariable(T17), TypeVariable(T18), TypeVariable(T19), TypeVariable(T20), TypeVariable(T21), TypeVariable(T22)) -> TypeVariable(R), noinline options: DefinitionOptions<TypeVariable(R)>? /* = (BeanDefinition<TypeVariable(R)>.() -> Unit)? */ = ...): KoinDefinition<TypeVariable(R)> defined in org.koin.androidx.viewmodel.dsl
Have we hit kotlin's arity limit basically? After trying to read up on it I came across the language spec for function types but there seems to be functionN
as well to cover cases where more than 22 function params are needed. Does Koin use function1, function2
, etc. instead of functionN
behind the scenes or am I interpreting this error wrongly?
I don't think this is a limitation of Kotlin (anymore). It's just that Koin doesn't provide overloads for view models with more than 22 parameters. You could add your own overloads with 23 (or more) parameters:
inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16, reified T17, reified T18, reified T19, reified T20, reified T21, reified T22, reified T23> Module.viewModelOf(
crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23) -> R,
noinline options: DefinitionOptions<R>? = null,
): KoinDefinition<R> = viewModel { new(constructor) }.onOptions(options)
inline fun <reified R, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10, reified T11, reified T12, reified T13, reified T14, reified T15, reified T16, reified T17, reified T18, reified T19, reified T20, reified T21, reified T22, reified T23> Scope.new(
constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23) -> R,
): R = constructor(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get())
Although this would compile just fine, it will crash at runtime because Koin uses reflection internally and doesn't expect more than 22 parameters.
I don't know of a way to circumvent this, so the only option would be to reduce the number of parameters. Either split your view models so each of them won't need more than 22 dependencies or merge your dependencies. You could bundle your dependencies in simple wrappers so you only need to inject one. Not elegant, but at least it would work.