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