Michal Klimczak
08/28/2019, 6:56 AMprivate val fragmentInjectors = listOf<Pair<Class<out Fragment>, Fragment.() -> Unit>>(
MainControlFragment::class.java to fun Fragment.(){
(this as MainControlFragment).viewModelFactory = mockViewModelFactory
}
)
but ideally I would like something like
private val fragmentInjectors = listOf<Pair<Class<out Fragment>, Fragment.() -> Unit>>(
MainControlFragment::class.java to fun MainControlFragment.(){
this.viewModelFactory = mockViewModelFactory
}
)
to avoid casting. But unfortunately compiler complains about type inference failed, expected type mismatch
because of MainControlFragment and Fragment being different types. Anyone knows the right syntax?Matej Drobnič
08/28/2019, 7:19 AMBaseFragment
that has view model factoryMichal Klimczak
08/28/2019, 7:37 AMwasyl
08/28/2019, 8:12 AMin
variance on the second parameter. Unfortunately Pair
has out
variance, so I had to use own pair type
data class OwnPair<A, B>(
val first: A,
val second: B
)
private val fragmentInjectors = listOf<OwnPair<Class<out Fragment>, in Fragment.() -> Unit>>(
OwnPair(MainControlFragment::class.java, fun MainControlFragment.() { // Can be different fragment types
this.viewModelFactory
})
)
Michal Klimczak
08/28/2019, 8:43 AMwasyl
08/28/2019, 8:49 AMClass<T>
and T.() -> Unit
parameters in own pair class in the first placeMichal Klimczak
08/28/2019, 8:51 AMdata class TypedBlock<T>(val clazz: Class<T>, val block: T.() -> Unit)
(I know, the name is lame, but w/e)
and have something like listOf<TypedBlock<out Fragment>>(
TypedBlock(
MainControlFragment::class.java,
fun MainControlFragment.() {
viewModelFactory = controlFragmentViewModelFactory
}
)
But I need out variance in the DispatchingAndroidInjector_Factory.newDispatchingAndroidInjector<Fragment>(map)
private fun createFakeFragmentsInjector(fragmentInjectorBlocks: List<TypedBlock<Fragment>>): DispatchingAndroidInjector<Fragment> {
val map = fragmentInjectorBlocks
.map { (clazz, block) ->
val injector = AndroidInjector<Fragment> { instance ->
if (instance::class.java == clazz) {
instance.block()
}
}
clazz to AndroidInjector.Factory<Fragment> { injector }
}
.map { (clazz, factory) ->
clazz to (Provider { factory } as Provider<Factory<out Fragment>>)
}
.toMap()
.toMutableMap()
return DispatchingAndroidInjector_Factory.newDispatchingAndroidInjector<Fragment>(map)
}