Dagger 2跨Android模块的子组件

Dagger 2跨Android模块的子组件,android,module,dagger-2,Android,Module,Dagger 2,最近,我开始将我们的应用程序划分为更小的Android模块,但我不知道如何构造dagger使其适合我 我的方法是将较大的功能划分为较小的模块。目前,我的大部分功能都在一个基本模块中 我现在的工作: App ^ | Base ^ | Mvvm core MyDagger设置包括: -@Singleton作用域的AppComponent -@UserScope子组件Us

最近,我开始将我们的应用程序划分为更小的Android模块,但我不知道如何构造dagger使其适合我

我的方法是将较大的功能划分为较小的模块。目前,我的大部分功能都在一个基本模块中

我现在的工作:

         App
          ^ 
          |
         Base
          ^
          |
      Mvvm core
MyDagger设置包括: -@Singleton作用域的AppComponent -@UserScope子组件UserComponent

两者都放置在基本模块中

我正在努力实现的目标:

         App
          ^ 
          |
Feature 1 - Feature 2
          ^
          |
         Base
          ^
          |
      Mvvm core
我的计划是,每个功能在其自己的模块中都有一个@FeatureX子组件,但这就是所有功能都不完整的地方

我不知道如何将子组件.Build公开到我的每个功能模块中

这是正确的方法还是我遗漏了什么


额外信息:我还尝试将AppComponent和UserComponent移动到应用模块中,但随后我无法从功能模块访问该组件(我需要注入该组件)。

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

Cookie活动:

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
    }
}
现在,您希望从主应用程序中使用此CookieActivity。首先,您需要创建AppComponent注意,CookieModule安装在组件内部:

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, CookieModule::class])
interface AppComponent : AndroidInjector<App>
您现在可以使用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)
        }
    }
}

Oreo将显示为CookieModule提供的功能。

功能包含哪些内容:活动、实用程序类、型号?是的,功能需要的所有功能都可以正常工作。因此,如果我没有弄错,您的功能模块需要访问您的应用依赖项,并且您的应用还需要访问您的功能子组件?否。我的功能模块将包含一个子组件,该子组件位于AppComponent的基本模块中。但我的问题是,要创建子组件,您需要父组件,而不需要访问父组件来构建子组件
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
    }
}
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)
        }
    }
}