-
-
Save manuelvicnt/437668cda3a891d347e134b1de29aee1 to your computer and use it in GitHub Desktop.
| // IMPORTANT! READ THIS FIRST | |
| // Assisted Injection doesn't work with @HiltViewModel or @ViewModelInject | |
| // Read more about the issue here: https://github.com/google/dagger/issues/2287 | |
| // | |
| // | |
| // 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" | |
| } | |
| } | |
| } | |
| } |
Thank you for the example, Worked great!
thanks, works like a charm!
From AssistedInject 0.6.0, the generated class AssistedInject_AssistedInjectModule will also be annotated with @InstallIn.
Do we still need @Module(includes = [AssistedInject_AssistedInjectModule::class]) instead of just @Module ?
From AssistedInject 0.6.0, the generated class
AssistedInject_AssistedInjectModulewill also be annotated with@InstallIn.
Do we still need@Module(includes = [AssistedInject_AssistedInjectModule::class])instead of just@Module?
It seems like you can just use @module now. I'm still testing it though
Thanks helped me!
Thank I need to coroutine scope inject into viewmodel
Thanks for the code!
i got error like below with hilt 2.35:
ViewModel constructor should be annotated with @Inject instead of @AssistedInject.
[Hilt] Processing did not complete. See error above for details.
@gturedi How did you solve this issue?
How can I inject headers at runtime in retrofit following this?
I found an issue with
inline class, if you useinline classas an@Assistedannotated parameter, the processor doesn't detect that and throw error saying that it needs constructor with at least one@Assistedparameter