Custom ViewModelProviderFactory is not working after converting into kotlin android

221 Views Asked by At

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)
    }

}
1

There are 1 best solutions below

0
On

Try something like this for the Component class:

@Component(modules = [(ConnectivityModule::class), ...]) // Add other modules in this array if needed
interface AppComponent {

    fun inject(whatever: Whatever) // etc.
    ...
}

If this doesn't make sense, I used this tutorial to get Dagger2 working with kotlin: https://antonioleiva.com/dagger-android-kotlin/