My app fall in runtime when I open fragment. Error: lateinit property viewModelFactory has not been initialized
class DetailCharacterFragment : Fragment() {
private val viewModel: CharacterViewModel by viewModels {
CharacterViewModel.provideFactory(myRepository = CharactersRepository(RetrofitNetwork.getNetworkApi()), this)
}
AppComponent
@Singleton
@Component(modules = [
AndroidInjectionModule::class,
AppModule::class]
)
interface AppComponent : AndroidInjector<RickAndMortyApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
override fun inject(app: RickAndMortyApplication)
Application:
class RickAndMortyApplication: DaggerApplication() {
private val applicationInjector = DaggerAppComponent.builder().application(this).build()
override fun applicationInjector(): AndroidInjector<out DaggerApplication> = applicationInjector
AppModule
@Module (
includes = [
ViewModelModule::class]
)
class AppModule
ViewModelFactory
@Singleton
class ViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
I try make as here: https://github.com/ronnieotieno/Dagger-2-Mvvm-Android/tree/master/app/src/main/java/dev/ronnie/imageloaderdagger2
That's my first expirence with Dagger.