NSkyKit 项目实践-Dagger2
kotlin中配置Dagger2
- 在app模塊的build.gradle文件中進行如下配置,
- 相關常用注解:
@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) {@Injectconstructor() : this("Tom") } 復制代碼標記屬性
被標記的屬性不能是final的,kotlin中不能是val。 被注入進的屬性不能用private修飾(是Dagger2不支持,而非@Inject不支持)
@Injectlateinit var people:People 復制代碼標記方法
被標記的方法可以有0個或多個依賴作為參數。 方法不能是抽象的。
class HomeActivity : AppCompatActivity() {private lateinit var people:People@Injectfun setPeople(people:People){this.people = people} } 復制代碼這種方法注入和屬性注入并沒有什么本質上的不同,實現效果也基本一樣。還有一種做法是@Inject標記被注入類的某個方法,該方法會在類的構造方法之后接著被調用:
data class People constructor(val name: String) {@Injectconstructor() : this("Tom")init {println("init:$name")}@Injectfun hello(){println("hello:$name")} }class HomeActivity : AppCompatActivity() {@Injectlateinit var people:Peopleoverride 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;
ApplicationComponent
@Singleton @Component(modules = [AndroidSupportInjectionModule::class,ActivityModule::class,SupportFragmentModule::class,MainDaggerModule::class,HomeDaggerModule::class] ) interface ApplicationComponent : AndroidInjector<SkyApplication> {@Component.Builderabstract class Builder : AndroidInjector.Builder<SkyApplication>()} 復制代碼ActivityModule、SupportFragmentModule
@Module abstract class ActivityModule {@ContributesAndroidInjectorabstract fun contributeMainActivity(): MainActivity }/*** SupportFragment Dagger2 Module*/ @Module abstract class SupportFragmentModule {@ContributesAndroidInjectorabstract fun contributeCatalogFragment(): HomeFragment@ContributesAndroidInjectorabstract fun contributeDiscoverFragment(): DiscoverFragment@ContributesAndroidInjectorabstract fun contributeSettingFragment(): SettingFragment} 復制代碼MainActivity
class MainActivity : CoreDaggerActivity(), BottomNavigationView.OnNavigationItemSelectedListener {@Injectlateinit var mMainViewModel: MainViewModelvar mDataBingding: ActivityMainBinding? = nullprivate var mAdapter: CoreFragmentPagerAdapter? = nulloverride 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
總結
以上是生活随笔為你收集整理的NSkyKit 项目实践-Dagger2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache Beam和BigQuery
- 下一篇: 基于django的视频点播网站开发-st