Skip to content

Instantly share code, notes, and snippets.

@rubywai
Forked from manuelvicnt/AnAndroidApp.kt
Last active December 24, 2020 05:39
Show Gist options
  • Save rubywai/80db1ebff976cd3c634a801ed1a665e4 to your computer and use it in GitHub Desktop.
Save rubywai/80db1ebff976cd3c634a801ed1a665e4 to your computer and use it in GitHub Desktop.
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"
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment