首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨Android模块的Dagger 2子组件

跨Android模块的Dagger 2子组件
EN

Stack Overflow用户
提问于 2018-12-05 10:54:01
回答 1查看 219关注 0票数 0

最近,我开始把我们的应用程序分成更小的Android模块,但是我不知道如何构造匕首,所以它适合我。

我的方法是将“更大”的特性划分为更小的模块。目前,我的大部分功能都在base模块中。

我现在工作的是:

代码语言:javascript
复制
         App
          ^ 
          |
         Base
          ^
          |
      Mvvm core

MyDagger设置包括:

  • 一个@Singleton作用域的AppComponent
  • 一个@UserScope子组件UserComponent

这两个模块都放在Base模块中。

我想要达到的目标是:

代码语言:javascript
复制
         App
          ^ 
          |
Feature 1 - Feature 2
          ^
          |
         Base
          ^
          |
      Mvvm core

我的计划是,每个特性都将在自己的模块中有一个@FeatureX子组件--但这是一切都崩溃的地方。

我不知道如何将SubComponent.Build公开给我的每个功能模块。

这是正确的做法还是我错过了什么?

额外信息:我也尝试过将AppComponent & UserComponent移动到App模块中,但是之后我无法从特性模块访问组件,这是我需要注入的组件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-05 13:24:41

假设您已经创建了一个名为cookie的android模块,它包含一个活动和一个匕首模块。

CookieActivity:

代码语言:javascript
复制
class CookieActivity : DaggerAppCompatActivity() {

    @Inject
    lateinit var name: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_cookie)

        findViewById<TextView>(R.id.name).text = name
    }
}

CookieModule:

代码语言:javascript
复制
@Module
abstract class CookieModule {

    @ContributesAndroidInjector
    abstract fun cookieActivity(): CookieActivity

    @Module
    companion object {

        @Provides
        @JvmStatic
        fun provideName() = "Oreo"
    }
}

现在,您希望从您的主应用程序中使用这个CookieActivity。首先,您需要创建您的AppComponent (注意,CookieModule安装在组件中):

代码语言:javascript
复制
@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, CookieModule::class])
interface AppComponent : AndroidInjector<App>

然后使您的Application类能够注入活动和片段:

代码语言:javascript
复制
class App : Application(), HasActivityInjector, HasSupportFragmentInjector {

    @Inject
    internal lateinit var dispatchingActivityInjector: DispatchingAndroidInjector<Activity>

    @Inject
    internal lateinit var dispatchingFragmentInjector: DispatchingAndroidInjector<Fragment>

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.builder()
            .build()
            .inject(this)
    }
    override fun activityInjector(): AndroidInjector<Activity>? {
        return dispatchingActivityInjector
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
        return dispatchingFragmentInjector
    }
}

现在您可以使用您的CookieActivity,主应用程序将负责注入:

代码语言:javascript
复制
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<Button>(R.id.button).setOnClickListener {
            val intent = Intent(this, CookieActivity::class.java)
            startActivity(intent)
        }
    }
}

“奥利奥”将按CookieModule提供的方式显示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53630637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档