NSkyKit 项目实践-Dagger2

kotlin中配置Dagger2

  • 在app模块的build.gradle文件中进行如下配置,
//dagger
    api "com.google.dagger:dagger:$dagger_version"
    annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
    api "com.google.dagger:dagger-android:$dagger_version"
    api "com.google.dagger:dagger-android-support:$dagger_version"
    annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
复制代码
  • 相关常用注解:
@Inject
@Component
@Module
@Provides
@Qualifier和@Named
@Scope和@Singleton
复制代码

@Inject

@Inject注解只是JSR-330中定义的注解,在javax.inject包中。 这个注解本身并没有作用,它需要依赖于注入框架才具有意义,可以用来标记构造函数、属性和方法。

标记构造函数 被标记的构造函数可以有0个或多个依赖作为参数。 同一个类中最多只可以标记一个构造函数。

class People @Inject constructor(val name:String = "Tom")
复制代码

注意在kotlin中这种写法是不被允许的,因为这等价于java中的多个构造方法People(String name), People(),正确的写法应该是这样:

data class People constructor(val name: String) {
    @Inject
    constructor() : this("Tom")
}
复制代码

标记属性

被标记的属性不能是final的,kotlin中不能是val。 被注入进的属性不能用private修饰(是Dagger2不支持,而非@Inject不支持)

 @Inject
 lateinit var people:People
复制代码

标记方法

被标记的方法可以有0个或多个依赖作为参数。 方法不能是抽象的。

class HomeActivity : AppCompatActivity() {
    private lateinit var people:People

    @Inject
    fun setPeople(people:People){
        this.people = people
    }
}
复制代码

这种方法注入和属性注入并没有什么本质上的不同,实现效果也基本一样。还有一种做法是@Inject标记被注入类的某个方法,该方法会在类的构造方法之后接着被调用:


data class People constructor(val name: String) {
    @Inject
    constructor() : this("Tom")

    init {
        println("init:$name")
    }

    @Inject
    fun hello(){
        println("hello:$name")
    }
}

class HomeActivity : AppCompatActivity() {
    @Inject
    lateinit var people:People

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        //执行相关注入操作
        ...
        println(people.toString())
    }
}

复制代码

运行结果是这样的:

01-02 11:57:30.995 16601-16601/? I/System.out: init:Tom
01-02 11:57:30.995 16601-16601/? I/System.out: hello:Tom
01-02 11:57:30.995 16601-16601/? I/System.out: People(name=Tom)
复制代码

项目相关代码

application

class SkyApplication:DaggerApplication(){
    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerApplicationComponent.builder().create(this)
    }

    override fun onCreate() {
        super.onCreate()
        CoreAppExt.onCreate(this, true)
    }

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        CoreAppExt.attachBaseContext(base)
    }
}
复制代码

xxxDaggerActivity

由于只能单继承,使用dagger时继承CoreDaggerActivity,CoreDaggerFragment,代码和 DaggerActivity、CoreDaggerFragment 相同;
不使用时,可以直接继承CoreActivity,CoreFragment;

abstract class CoreDaggerActivity : CoreActivity(), HasFragmentInjector, HasSupportFragmentInjector {

    @Inject
    lateinit var supportFragmentInjector: DispatchingAndroidInjector<Fragment>
    @Inject
    lateinit var frameworkFragmentInjector: DispatchingAndroidInjector<android.app.Fragment>

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
        return supportFragmentInjector
    }

    override fun fragmentInjector(): AndroidInjector<android.app.Fragment>? {
        return frameworkFragmentInjector
    }
}
复制代码
abstract class CoreDaggerFragment<T : ViewDataBinding>  : CoreFragment<T>(), HasSupportFragmentInjector {

    @Inject
    lateinit var childFragmentInjector: DispatchingAndroidInjector<Fragment>

    override fun onAttach(context: Context?) {
        AndroidSupportInjection.inject(this)
        super.onAttach(context)
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment>? {
        return childFragmentInjector
    }
}
复制代码

ApplicationComponent

@Singleton
@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        ActivityModule::class,
        SupportFragmentModule::class,
        MainDaggerModule::class,
        HomeDaggerModule::class]
)
interface ApplicationComponent : AndroidInjector<SkyApplication> {
    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<SkyApplication>()

}
复制代码

ActivityModule、SupportFragmentModule

@Module
abstract class ActivityModule {

    @ContributesAndroidInjector
    abstract fun contributeMainActivity(): MainActivity
}

/**
 * SupportFragment Dagger2 Module
 */
@Module
abstract class SupportFragmentModule {
    @ContributesAndroidInjector
    abstract fun contributeCatalogFragment(): HomeFragment

    @ContributesAndroidInjector
    abstract fun contributeDiscoverFragment(): DiscoverFragment

    @ContributesAndroidInjector
    abstract fun contributeSettingFragment(): SettingFragment

}
复制代码

MainActivity

class MainActivity : CoreDaggerActivity(), BottomNavigationView.OnNavigationItemSelectedListener {

    @Inject
    lateinit var mMainViewModel: MainViewModel

    var mDataBingding: ActivityMainBinding? = null
    private var mAdapter: CoreFragmentPagerAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mDataBingding = bindingContentView(R.layout.activity_main)
        setUpNavigation()
        setUpViewPager()
        NSkyLog.d(TAG, "MainViewModel ${mMainViewModel.doSomething()}")
    }
    
复制代码

结果信息

2019-02-18 18:32:27.279 20743-20768/? I/com.nsky.app_LOGGER: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: │ Thread: pool-1-thread-1
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: │ NSkyLog.i  (NSkyLog.java:82)
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: │    NSkyLog$DefaultLogDelegate.i  (NSkyLog.java:48)
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: │ CoreAppExt:onCreate
2019-02-18 18:32:27.280 20743-20768/? I/com.nsky.app_LOGGER: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2019-02-18 18:32:27.451 20743-20743/? D/com.nsky.app_LOGGER: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: │ Thread: main
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: │ NSkyLog.d  (NSkyLog.java:88)
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: │    NSkyLog$DefaultLogDelegate.d  (NSkyLog.java:53)
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: │ MainActivity:MainViewModel This is MainViewModel
2019-02-18 18:32:27.452 20743-20743/? D/com.nsky.app_LOGGER: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────

复制代码

项目地址: NSkyKit

转载于:https://juejin.im/post/5c5163126fb9a049cb19298d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值