【问题标题】:Custom ViewModelProviderFactory is not working after converting into kotlin android自定义 ViewModelProviderFactory 转换为 kotlin android 后不起作用
【发布时间】:2019-01-14 07:32:01
【问题描述】:

我正在为我的不同 ViewModel 类使用多个自定义 ViewModelProviderFactory。并使用匕首提供依赖。这是我在 java 中的 Module 类:

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

这是我转换成 kotlin 类后的 Module 类:

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

}

【问题讨论】:

    标签: java android kotlin dagger-2 viewmodelproviders


    【解决方案1】:

    对 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/

    【讨论】:

      猜你喜欢
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2012-09-10
      • 2021-04-29
      • 2021-08-28
      相关资源
      最近更新 更多