Пользовательский ViewModelProviderFactory не работает после преобразования в kotlin android - PullRequest
0 голосов
/ 14 января 2019

Я использую несколько пользовательских ViewModelProviderFactory для моего другого класса ViewModel. И предоставление зависимости с помощью кинжала. Вот мой класс модуля в 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);
    }

}

А вот мой Фабричный класс:

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

Работает нормально, но после преобразования java-кода в kotlin перестает работать и показывает ошибку ниже:

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)

А вот мой класс Module после преобразования в класс kotlin:

@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 Ответ

0 голосов
/ 14 января 2019

Попробуйте что-то вроде этого для класса Component:

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

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

Если это не имеет смысла, я использовал этот учебник, чтобы заставить Dagger2 работать с kotlin: https://antonioleiva.com/dagger-android-kotlin/

...