最近,我开始把我们的应用程序分成更小的Android模块,但是我不知道如何构造匕首,所以它适合我。
我的方法是将“更大”的特性划分为更小的模块。目前,我的大部分功能都在base模块中。
我现在工作的是:
App
^
|
Base
^
|
Mvvm coreMyDagger设置包括:
@Singleton作用域的AppComponent@UserScope子组件UserComponent这两个模块都放在Base模块中。
我想要达到的目标是:
App
^
|
Feature 1 - Feature 2
^
|
Base
^
|
Mvvm core我的计划是,每个特性都将在自己的模块中有一个@FeatureX子组件--但这是一切都崩溃的地方。
我不知道如何将SubComponent.Build公开给我的每个功能模块。
这是正确的做法还是我错过了什么?
额外信息:我也尝试过将AppComponent & UserComponent移动到App模块中,但是之后我无法从特性模块访问组件,这是我需要注入的组件。
发布于 2018-12-05 13:24:41
假设您已经创建了一个名为cookie的android模块,它包含一个活动和一个匕首模块。
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提供的方式显示。
https://stackoverflow.com/questions/53630637
复制相似问题