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