My code:
@Component(
modules = [
AndroidSupportInjectionModule::class,
ActivityBuildersModule::class,
ViewModelFactoryModule::class
]
)
interface AppComponent : AndroidInjector<BaseApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
@Module
abstract class ActivityBuildersModule {
@ContributesAndroidInjector(
modules = [MainActivityViewModelModule::class]
)
abstract fun contributeMainActivity(): MainActivity
}
@Module
abstract class MainActivityViewModelModule {
@Binds
@IntoMap
@ViewModelKey(MainActivityViewModel::class)
public abstract fun bindMainActivityViewModel(mainActivityViewModel: MainActivityViewModel): ViewModel
}
class MainActivityViewModel @Inject constructor(application: Application) : AndroidViewModel(application) {
// empty for now
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
class MainActivity : AppCompatActivity() { <-- I made mistake here. I must Extend DaggerAppCompatActivity instead of AppCompatActivity.
// doesn't work for now
@Inject
lateinit var viewModelProviderFactory: ViewModelProviderFactory
lateinit var mainActivityViewModel: MainActivityViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainActivityViewModel = ViewModelProvider(this, viewModelProviderFactory).get(MainActivityViewModel::class.java)
setMainFragment()
}
private fun setMainFragment() {
// my code
}
}
It gives me an error: lateinit property viewModelProviderFactory has not been initialized.
The same code works fine in another project in Java.
Extend DaggerAppCompatActivity instead of AppCompatActivity