Skip to content

qq549631030/MultiModuleDagger2

Repository files navigation

组件化项目

使用dependencies方式

在组件化多模块项目中,app模块只在最终打包的时候直接依赖user,news模块,当user,news作为单独APP来运行时与app不存在依赖关系了,所以Appcomponent不能放在app模块中了这种情况下应该放在base中。

然而如果放在base模块中,base没有user,news的依赖,无法使用注册UserComponent和NewsComponent所以这时候不能再使用SubComponent方法来实现依赖了

这种情况下只能使用dependencies方式

base模块中

@Module
class AppModule {
    @IntoSet
    @Provides
    fun provideString(): String {
        return "app"
    }
}
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
    @Component.Factory
    interface Factory {
        fun create(@BindsInstance context: Context): AppComponent
    }
}
class BaseApplication : Application() {
    lateinit var appComponent: AppComponent
    override fun onCreate() {
        super.onCreate()
        instance = this
        appComponent = DaggerAppComponent.factory().create(this)
    }

    companion object {
        lateinit var instance: BaseApplication
    }
}

这里AppComponent放在BaseApplication中,这样user,news模块可以直接使用

user模块

@Module
class UserModule {
    @IntoSet
    @Provides
    fun provideString(): String {
        return "user"
    }
}
@UserScope
@Component(modules = [UserModule::class], dependencies = [AppComponent::class])
interface UserComponent {
    fun inject(userActivity: UserActivity)
}

news模块

@Module
class NewsModule {
    @IntoSet
    @Provides
    fun provideString(): String {
        return "news"
    }
}
@NewsScope
@Component(modules = [NewsModule::class], dependencies = [AppComponent::class])
interface NewsComponent {
    fun inject(newsActivity: NewsActivity)
}

要生成NewsComponent和UserComponent必须先得到AppComponent,通过以下方法来创建

 val newsComponent = DaggerNewsComponent.builder()
            .appComponent(BaseApplication.instance.appComponent)
            .build()
 val userComponent = DaggerUserComponent.builder()
            .appComponent(BaseApplication.instance.appComponent)
            .build()
object NewsComponentHolder {
    val newsComponent: NewsComponent by lazy {
        DaggerNewsComponent.builder()
            .appComponent(BaseApplication.instance.appComponent)
            .build()
    }
}
object UserComponentHolder {
    val userComponent: UserComponent by lazy {
        DaggerUserComponent.builder()
            .appComponent(BaseApplication.instance.appComponent)
            .build()
    }
}

最后在Activity中使用和前一篇一样

class NewsActivity : AppCompatActivity() {

    @Inject
    lateinit var set: Set<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_news)
        NewsComponentHolder.newsComponent.inject(this)
        text.text = set.toString()
    }
}

class UserActivity : AppCompatActivity() {

    @Inject
    lateinit var set: Set<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user)
        UserComponentHolder.userComponent.inject(this)
        text.text = set.toString()
    }
}

About

Dagger2组件化项目依赖方式选择

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages