最近我开始将应用程序划分为较小的Android模块,但我不知道如何构造匕首,因此它对我有用。
我的方法是将“较大”的功能分为较小的模块。目前,我的大部分功能都位于base
模块中。
我现在正在做什么:
App
^
|
Base
^
|
Mvvm core
MyDagger设置包括:
-@Singleton
范围内的AppComponent
-@UserScope
子组件UserComponent
两者都放置在Base
模块中。
我要实现的目标:
App
^
|
Feature 1 - Feature 2
^
|
Base
^
|
Mvvm core
我的计划是每个功能在其各自的模块中都会有一个@FeatureX
子组件-但这就是一切的地方。
我不知道如何向每个功能模块公开SubComponent.Build
。
这是正确的方法还是我缺少的是什么?
奖金信息:我也曾尝试将AppComponent
和UserComponent
移至App
模块中,但是随后我无法从我的部件中访问需要注入的组件功能模块。
答案 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
所提供。