当前位置: 首页 > 知识库问答 >
问题:

Android使用带有多个项目模块的Dagger2

康赞
2023-03-14

MyApp和MyAppCore有自己的AppComponent,MyApp提供ViewModel工厂,MyAppCore提供数据库和网络访问工厂(下面的示例)。

我不确定如何链接AppComponent(或应用程序),以便在MyApp中提供数据库和网络访问。以下是我目前掌握的信息:

MyAppCore模块

open class CoreApp : Application() {

    val appComponent: AppComponent by lazy {
        initializeComponent()
    }

    open fun initializeComponent(): AppComponent {
        return DaggerAppComponent.builder()
            .build()
    }
}
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
    }
}
@Module
class AppModule {
    @Singleton
    @Provides
    fun provideDb(app: Application) = MyDb.getInstance(app)

    @Singleton
    @Provides
    fun provideCommentDao(db: MyDb) = db.commentDao()
}
@Singleton
class CommentRep @Inject constructor(private val dao: CommentDao)  {

    fun saveComment(comment: Comment){
        dao.insert(comment)
    }

}

MyAppCore还具有名为mydb的Room数据库实现和接口commodao(我认为我不需要在这个问题中添加此代码)。

MyApp模块

MyApp

open class MyApp : Application(), DaggerComponentProvider {
    override val appComponent: AppComponent by lazy {
        initializeComponent()
    }

    open fun initializeComponent(): AppComponent {
        return DaggerAppComponent.builder()
            .applicationContext(applicationContext)
            .build()
    }
}
interface DaggerComponentProvider {
    val appComponent: AppComponent
}

val Activity.injector get() = (application as DaggerComponentProvider).appComponent
@Singleton
@Component
interface AppComponent{

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun applicationContext(applicationContext: Context): Builder
        fun build(): AppComponent
    }

    fun commentsViewModelFactory(): ViewModelFactory<CommentsViewModel>
}

ViewModelFactory

class ViewModelFactory<VM : ViewModel> @Inject constructor(
    private val viewModel: Provider<VM>
) : ViewModelProvider.Factory {

    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel> create(modelClass: Class<T>) = viewModel.get() as T
}
class CommentsViewModel @Inject constructor(private val repository: CommentRep) : ViewModel() {   
    fun saveComment(comment: Comment){
        repository.saveComment(comment)
    }
}

然后我的活动,注入虚拟机,但我认为他们没有必要包括他们的代码在这个问题。

当然,如果我这样编译我的项目,就不会生成来自MyAppCore的图,因此我会得到需要提供commentDAO的错误,因为commentrep需要提供commentrepcommentsviewmodel所使用的图。我猜想MyAppCore应用程序类被MyApp应用程序类重写,因此MyAppCore的AppComponent从未实例化,因此从未在我的图中添加所有内核的注入。我如何解决这个问题?提前感谢!

共有1个答案

方光华
2023-03-14

只需使用一个组件。首先,将MyAppCore模块添加到MyApp的gradle依赖项中。然后,让MyApp模块提供包含两个项目模块中的所有dagger模块的组件。

您还可以将MyAppCore模块更改为库模块,因为您只需要一个应用程序模块。在build.gradle文件中,替换:

apply plugin: 'com.android.application'

apply plugin: 'com.android.library'
implementation project(":myappcore")
@Singleton
@Component(modules=[MyAppCoreModule::class, MyAppModule::class])
interface AppComponent {
...
}
 类似资料:
  • 我有以下Maven项目结构: i、 e.Project1、Project2和Project3在目录结构上是对等的,它们都是Spring Boot应用程序(JAR)。我想将Project2和Project3视为Project1的子项,而不改变目录结构。当我在父项目上执行相同的maven命令时,我需要在子项目上过渡地执行所有maven命令。而且最重要的是,我应该能够将它们打包到一个JAR文件中。我在谷

  • 我设计了一个maven多模块项目,就像下面这个帖子的第一个答案:Multi-module maven with Spring Boot 现在我想要一个通用的maven模块,它可以包含一些供多个微服务使用的模型。如果我将这个公共项目作为第一级父pom的子项目(这样所有由引导注入的依赖项(如jpa、jackson等)都可用于公共项目),那么STS/Spring将它检测为引导应用程序,并抱怨maven

  • 多模块项目具有具有以下依赖关系的模块:web- 我在web模块中添加了sping-boo-gradle-plugin: 当SpringBootGradle插件下载旧的hibernate版本时,我在持久性模块中有重复的版本。 形象 我尝试覆盖web模块中的hibernate依赖项,它正在工作: 形象 为什么插件下载旧的Hibernate版本?是否有任何可能排除旧的Hibernate版本从sping-

  • 我在项目中有两个模块(和)运行集成测试。我希望在测试之前,我的应用程序将使用liquibase启动和滚动迁移,但由于我通过集成测试模块运行应用程序,liquibase正在寻找一个关于该模块的主文件,该文件导致了错误。因为主文件位于miom应用程序()的模块中

  • null 我们是否必须构建没有依赖项的jar,war,并让它们在生产机器上第一次引导时下载依赖项?还是单独的依赖包,这样在增量部署中,我们就不需要重新上传整个东西了吗? 问候, 更新1:

  • 我已经找了很长时间的答案,但并没有运气,所以我决定张贴它。最近,我尝试用父pom制作一些简单的应用程序,以轻松管理我的依赖项版本。因此,我在我的父母pom中添加了依赖项,添加了第一个简单的依赖项,我得出了: 然后我做了第一个孩子项目: 我确实试着建造,但最终 现在我不明白为什么Spring Boot依赖项被正确地提取出来,但spring cloud不是,如果我将dependencymanageme