首页 > 解决方案 > 功能模块中的 Hilt

问题描述

我在 android 项目中添加了一个动态功能模块。我知道 hilt 不支持这种类型的模块。我在 google 文档中找到了解决此问题的方法。

功能模块中的 Hilt

我有一个项目结构如下

@Component(
    dependencies = [MapboxModuleDependencies::class],
    modules = [MapboxModule::class]
)
interface MapboxComponent {

    fun inject(fragment: MapboxMapFragment)

    @Component.Builder
    interface Builder {
        fun context(@BindsInstance context: Context): Builder
        fun appDependencies(mapboxModuleDependencies: MapboxModuleDependencies): Builder
        fun build(): MapboxComponent
    }
}
@Module
class MapboxModule {

    @Provides
    fun provideGetMapTaskUseCase(repository: MapTaskRepository): GetMapTasksUseCase = GetMapTasksUseCase(repository)

    @Provides
    fun provideMapTaskRepository(dataSource: MapTaskDbDataSource): MapTaskRepository = MapTaskRepositoryImpl(dataSource)

    @Provides
    fun provideMapTaskDbDataSource(dbRepository: TaskDbRepository): MapTaskDbDataSource = MapTaskDbDataSourceImpl(dbRepository)
}
@EntryPoint
@InstallIn(ApplicationComponent::class)
interface MapboxModuleDependencies {

    fun provideDatabase(@ApplicationContext context: Context): AppDatabase

    fun provideTaskDao(appDatabase: AppDatabase): TaskDao

    fun provideTaskDbRepository(dao: TaskDao): TaskDbRepository
}
@Module
@InstallIn(ApplicationComponent::class)
object DatabaseModule {

    @Singleton
    @Provides
    fun provideDatabase(@ApplicationContext context: Context) = Room.databaseBuilder(
        context,
        AppDatabase::class.java,
        DatabaseConstants.databaseName
    ).allowMainThreadQueries().build()

    @Singleton
    @Provides
    fun provideTaskDao(appDatabase: AppDatabase) = appDatabase.taskDao()

    @Singleton
    @Provides
    fun provideTaskDbRepository(dao: TaskDao): TaskDbRepository = TaskDbRepositoryImpl(dao)

...
override fun onCreate(savedInstanceState: Bundle?) {
        fun setDaggerMapboxComponent() {
            DaggerMapboxComponent.builder()
                .context(requireContext())
                .appDependencies(
                    EntryPointAccessors.fromApplication(
                        requireContext(),
                        MapboxModuleDependencies::class.java
                    )
                )
                .build()
                .inject(this)
        }
...

当我运行一个项目时,它会得到这样的日志:

> Task :app:kaptDebugKotlin
C:\Users\piotrro\Desktop\wfm-mobile\app\build\generated\source\kapt\debug\com\apator\wfm\App_HiltComponents.java:173: error: [com.apator.utils.injection.MapboxModuleDependencies.provideDatabase(android.content.Context)] Members injection methods may only return the injected type or void.
  public abstract static class SingletonC implements MapboxModuleDependencies,
                         ^C:\Users\piotrro\Desktop\wfm-mobile\app\build\generated\source\kapt\debug\com\apator\wfm\App_HiltComponents.java:173: error: [com.apator.utils.injection.MapboxModuleDependencies.provideTaskDao(com.apator.database.AppDatabase)] Members injection methods may only return the injected type or void.
  public abstract static class SingletonC implements MapboxModuleDependencies,
                         ^C:\Users\piotrro\Desktop\wfm-mobile\app\build\generated\source\kapt\debug\com\apator\wfm\App_HiltComponents.java:173: error: [com.apator.utils.injection.MapboxModuleDependencies.provideTaskDbRepository(com.apator.utils.database.data.dao.TaskDao)] Members injection methods may only return the injected type or void.
  public abstract static class SingletonC implements MapboxModuleDependencies,
                         ^error: Cannot inject members into qualified types
> Task :app:kaptDebugKotlin FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
   > java.lang.reflect.InvocationTargetException (no error message)

有谁知道问题是什么?

标签: androidkotlindagger-2dagger-hiltdynamic-feature-module

解决方案


MapboxModuleDependencies你应该只定义TaskDbRepository这样的:

@EntryPoint
@InstallIn(ApplicationComponent::class)
interface MapboxModuleDependencies {

    fun provideTaskDbRepository(): TaskDbRepository
}

推荐阅读