Android模块中的Dagger 2子组件

时间:2018-12-05 10:54:02

标签: android module dagger-2

最近我开始将应用程序划分为较小的Android模块,但我不知道如何构造匕首,因此它对我有用。

我的方法是将“较大”的功能分为较小的模块。目前,我的大部分功能都位于base模块中。

我现在正在做什么:

         App
          ^ 
          |
         Base
          ^
          |
      Mvvm core

MyDagger设置包括:
-@Singleton范围内的AppComponent
-@UserScope子组件UserComponent

两者都放置在Base模块中。

我要实现的目标:

         App
          ^ 
          |
Feature 1 - Feature 2
          ^
          |
         Base
          ^
          |
      Mvvm core

我的计划是每个功能在其各自的模块中都会有一个@FeatureX子组件-但这就是一切的地方。

我不知道如何向每个功能模块公开SubComponent.Build

这是正确的方法还是我缺少的是什么?

奖金信息:我也曾尝试将AppComponentUserComponent移至App模块中,但是随后我无法从我的部件中访问需要注入的组件功能模块。

1 个答案:

答案 0 :(得分:1)

假设您创建了一个名为cookie的android模块,其中包含一个活动和一个dagger模块。

CookieActivity:

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:

@Module
abstract class CookieModule {

    @ContributesAndroidInjector
    abstract fun cookieActivity(): CookieActivity

    @Module
    companion object {

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

现在您要在主应用程序中使用此CookieActivity。首先,您需要创建AppComponent(注意,CookieModule已安装在组件内部):

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, CookieModule::class])
interface AppComponent : AndroidInjector<App>

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

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,主应用程序将负责注入:

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所提供。