I am using multiple custom ViewModelProviderFactory for my different ViewModel class. And providing the dependency using dagger. Here is my Module class in java:
@Module
public class ConnectivityModule {
@Provides
ConnectivityViewModel provideConnectivityViewModel(Application application, DataManager dataManager, ServiceConnector serviceConnector, CompositeDisposable compositeDisposable) {
return new ConnectivityViewModel(application, dataManager, serviceConnector, compositeDisposable);
}
@Provides
ConnectivityViewModelProviderFactory provideConnectivityViewModelFactory(ConnectivityViewModel connectivityViewModel) {
return new ConnectivityViewModelProviderFactory<>(connectivityViewModel);
}
}
And here is my Factory class:
public class ConnectivityViewModelProviderFactory<V> implements ViewModelProvider.Factory {
private V viewModel;
public ConnectivityViewModelProviderFactory(V viewModel) {
this.viewModel = viewModel;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
if (modelClass.isAssignableFrom(viewModel.getClass())) {
return (T) viewModel;
}
throw new IllegalArgumentException("Unknown class name");
}
}
Its working fine but after converting java code into kotlin its not working anymore and showing below error:
error: com.ui.factory.ConnectivityViewModelProviderFactory cannot be provided without an @Provides- or @Produces-annotated method.
public abstract interface AppComponent {
^
.ConnectivityViewModelProviderFactory is injected at
.ConnectingFragment.factory
.ConnectingFragment is injected at
.ConnectivitySubComponent.inject(connectingFragment)
And Here is my Module class after converting into kotlin class:
@Module
class ConnectivityModule {
@Provides
internal fun provideConnectivityViewModel(application: Application, dataManager: DataManager, serviceConnector: ServiceConnector, compositeDisposable: CompositeDisposable): ConnectivityViewModel {
return ConnectivityViewModel(application, dataManager, serviceConnector, compositeDisposable)
}
@Provides
internal fun provideConnectivityViewModelFactory(connectivityViewModel: ConnectivityViewModel): ConnectivityViewModelProviderFactory<*> {
return ConnectivityViewModelProviderFactory(connectivityViewModel)
}
}
Try something like this for the Component class:
If this doesn't make sense, I used this tutorial to get Dagger2 working with kotlin: https://antonioleiva.com/dagger-android-kotlin/