Skip to content

Instantly share code, notes, and snippets.

@osipxd
Last active April 12, 2020 10:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save osipxd/8cddb6c543f85e81bba466c1aa468a34 to your computer and use it in GitHub Desktop.
Save osipxd/8cddb6c543f85e81bba466c1aa468a34 to your computer and use it in GitHub Desktop.
Dagger AssistedInject + ViewModel
import com.squareup.inject.assisted.dagger2.AssistedModule
import dagger.Module
@Component(
modules = [ViewModelAssistedFactoriesModule::class] // <--- Add assisted module
)
interface SampleComponent {
fun inject(fragment: SampleFragment)
//...
}
@AssistedModule
@Module(includes = [AssistedInject_ViewModelAssistedFactoriesModule::class])
abstract class ViewModelAssistedFactoriesModule
@MainThread
inline fun <reified VM : ViewModel> Fragment.viewModels(
crossinline viewModelProducer: () -> VM
): Lazy<VM> {
return lazy(LazyThreadSafetyMode.NONE) { createViewModel(viewModelProducer) }
}
@MainThread
inline fun <reified VM : ViewModel> Fragment.createViewModel(
crossinline viewModelProducer: () -> VM
): VM {
val factory = object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <VM : ViewModel> create(modelClass: Class<VM>) = viewModelProducer() as VM
}
return ViewModelProviders.of(this, factory).get(VM::class.java)
}
class SampleViewModel @AssistedInject constructor( // <--- Use AssistedInject instead of Inject
@Assisted private val assistedArg: String
) : ViewModel() {
fun doSomething() {
Log.d("Assisted", assistedArg)
}
@AssistedInject.Factory // <--- Create factory
interface Factory {
fun create(assistedArg: String): SampleViewModel
}
}
class SampleFragment : Fragment() {
@Inject
lateinit var viewModelFactory: SampleViewModel.Factory // <--- Inject your factory. Not ViewModelProvider.Factory
private val viewModel by viewModels { viewModelFactory.create("Sample Arg") }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment