功能模块中的 Hilt
Hilt in feature modules
我在 android 项目中添加了一个动态功能模块。我知道 hilt 不支持这种类型的模块。我在 google 文档中找到了解决此问题的方法。
我的项目结构如下
- 应用程序 - 带有应用程序的主模块 activity
- 普通
- utils - 具有所有 android 模块通用功能的模块
- 数据库 - 包括数据库模块(刀柄)
- 网络 - 包括 http 客户端和 NetworkModule (hilt)
- 注入 - 包括 Mapbox 模块依赖项 class
- 核心
- 特点
- mapboxFeature - 包括 MapboxComponent 和 MapBoxModule
@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)
有人知道问题出在哪里吗?
在 MapboxModuleDependencies
中你应该只定义 TaskDbRepository
这样的:
@EntryPoint
@InstallIn(ApplicationComponent::class)
interface MapboxModuleDependencies {
fun provideTaskDbRepository(): TaskDbRepository
}
我在 android 项目中添加了一个动态功能模块。我知道 hilt 不支持这种类型的模块。我在 google 文档中找到了解决此问题的方法。
我的项目结构如下
- 应用程序 - 带有应用程序的主模块 activity
- 普通
- utils - 具有所有 android 模块通用功能的模块
- 数据库 - 包括数据库模块(刀柄)
- 网络 - 包括 http 客户端和 NetworkModule (hilt)
- 注入 - 包括 Mapbox 模块依赖项 class
- utils - 具有所有 android 模块通用功能的模块
- 核心
- 特点
- mapboxFeature - 包括 MapboxComponent 和 MapBoxModule
@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)
有人知道问题出在哪里吗?
在 MapboxModuleDependencies
中你应该只定义 TaskDbRepository
这样的:
@EntryPoint
@InstallIn(ApplicationComponent::class)
interface MapboxModuleDependencies {
fun provideTaskDbRepository(): TaskDbRepository
}