Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多模块项目-匕首_Android_Dagger 2_Dagger - Fatal编程技术网

Android 多模块项目-匕首

Android 多模块项目-匕首,android,dagger-2,dagger,Android,Dagger 2,Dagger,在我的Android项目中,我有: 核心库模块 ui\u添加信用卡库模块 应用程序作为应用程序模块 在核心中定义了AppComponent: @Singleton @Component( modules = { AppModule.class, NetworkModule.class, ViewModelFactoryModule.class, } ) public

在我的Android项目中,我有:

  • 核心库模块
  • ui\u添加信用卡库模块
  • 应用程序作为应用程序模块
核心中定义了
AppComponent

@Singleton
@Component(
        modules = {
                AppModule.class,
                NetworkModule.class,
                ViewModelFactoryModule.class,
        }
)
public interface AppComponent {
以及用于ViewModules的特殊模块,即绑定模块
ViewModelFactoryModule

@Module
abstract class ViewModelFactoryModule {

    @Binds
    abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(SplashViewModel::class)
    abstract fun bindSplashViewModel(viewModel: SplashViewModel): ViewModel
...
DaggerViewModelFactory
是一个特殊的ViewModelProvider。工厂将负责ViewModel键命名,因此注入活动/片段不需要关心它:

class DaggerViewModelFactory @Inject constructor(
        private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        val creator = creators[modelClass] ?: creators.entries.firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }    }
}
我得到以下错误:

AddCreditCardComponent.java:8:错误:[Dagger/MissingBinding]androidx.lifecycle.ViewModelProvider.Factory在没有@Providers注释方法的情况下无法提供


有什么帮助吗?我假设ViewModelProvider.Factory应该由我的
ViewModelFactoryModule
提供,但它没有发生:(

我通过以不同的方式创建模块
AddCreditCardViewModelModule
解决了我的问题(@Provider而不是@Binds)我必须创建专门的ViewModel.Factory,它将关心添加的ViewModel实例化

@Module
object AddCreditCardViewModelModule {

    @JvmStatic @Provides
    fun provideAddCreditCardViewModelFactory(
            adyenApi: AdyenApi,
            paymentController: PaymentController
    ) = AddCreditCardViewModelFactory(adyenApi, paymentController)

}
另外(thx to)确保来自
AppComponent
的依赖项(例如,
AdyenApi
)作为“getter”公开是至关重要的。否则
AddCreditCardComponent
将无法访问它


干杯!

可能想看一个更好的方法。Thx我会看的!但我的方法与Plaid应用程序和Ben Weiss文章非常相似,您正在使用组件depdenencies。与子组件相反,您无法访问组件依赖项拥有的所有内容,因此您必须显式添加“getter”(provision方法)对于
ViewModelFactory
到您的
AppComponent
如果您想从另一个从属组件访问它,可以在Plaid app中找到许多从属组件的示例:
@Module
abstract class AddCreditCardViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(CreditCardViewModel::class)
    abstract fun bindCreditCardRegistrationViewModel(
            viewModel: CreditCardRegistrationViewModel
    ): ViewModel

}
@Module
object AddCreditCardViewModelModule {

    @JvmStatic @Provides
    fun provideAddCreditCardViewModelFactory(
            adyenApi: AdyenApi,
            paymentController: PaymentController
    ) = AddCreditCardViewModelFactory(adyenApi, paymentController)

}