Hilt and AssistedInject working together in Hilt v2.28-alpha times - ViewModel version
// AssistedInject and Hilt working together in v2.28-alpha times | |
// Example of a ViewModel using AssistedInject injected in a Fragment by Hilt | |
// As AssistedInject isn't part of Dagger yet, we cannot use in | |
// conjuction with @ViewModelInject | |
data class MyInitParams(private val neededId: String) | |
class MyViewModel @AssistedInject constructor( | |
... // Other dependencies injected by Hilt | |
// com.squareup.inject.assisted.Assisted annotation | |
@Assisted private val initParams: MyInitParams | |
) : ViewModel() { | |
... // ViewModel logic | |
@AssistedInject.Factory | |
interface AssistedFactory { | |
fun create(initParams: MyInitParams): MyViewModel | |
} | |
companion object { | |
fun provideFactory( | |
assistedFactory: AssistedFactory, | |
initParams: MyInitParams | |
): ViewModelProvider.Factory = object : ViewModelProvider.Factory { | |
override fun <T : ViewModel?> create(modelClass: Class<T>): T { | |
return assistedFactory.create(initParams) as T | |
} | |
} | |
} | |
} | |
// This code uses "com.squareup.inject:assisted-inject-annotations-dagger2:0.5.2" | |
// AssistedInject puts all assisted bindings in the same module. | |
// We need to make a decision about where to install it. | |
// In this case, as we only need it in fragments, we install it there. | |
@InstallIn(FragmentComponent::class) | |
@AssistedModule | |
@Module(includes = [AssistedInject_AssistedInjectModule::class]) | |
// Needed until AssistedInject is incorporated into Dagger | |
interface AssistedInjectModule {} | |
@AndroidEntryPoint // Fragment injected by Hilt | |
class MyFragment : Fragment() { | |
private val args: MyFragmentArgs by navArgs() | |
// Inject the factory generated by AssistedInject | |
@Inject lateinit var myViewModelAssistedFactory: MyViewModel.AssistedFactory | |
// Initialize the ViewModel using ViewModelProvider.Factory | |
private val myViewModel: MyViewModel by viewModels { | |
MyViewModel.provideFactory( | |
myViewModelAssistedFactory, MyInitParams(args.neededId) | |
) | |
} | |
... // Fragment logic | |
} | |
// To disable checking for the InstallIn annotation in some modules, | |
// you need to enable the compiler option in your build.gradle file like this: | |
android { | |
defaultConfig { | |
javaCompileOptions { | |
annotationProcessorOptions { | |
arguments["dagger.hilt.disableModulesHaveInstallInCheck"] = "true" | |
} | |
} | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
Thank you for the example, Worked great! |
This comment has been minimized.
This comment has been minimized.
thanks, works like a charm! |
This comment has been minimized.
This comment has been minimized.
From AssistedInject 0.6.0, the generated class |
This comment has been minimized.
This comment has been minimized.
It seems like you can just use @module now. I'm still testing it though |
This comment has been minimized.
This comment has been minimized.
Thanks helped me! |
This comment has been minimized.
This comment has been minimized.
Thank I need to coroutine scope inject into viewmodel |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
I found an issue with
inline class
, if you useinline class
as an@Assisted
annotated parameter, the processor doesn't detect that and throw error saying that it needs constructor with at least one@Assisted
parameter