-
-
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_AssistedInjectModule
will 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 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