Skip to content

Commit 04db04d

Browse files
committed
使用dagger-android 完成注入
1 parent 75dceb1 commit 04db04d

File tree

11 files changed

+214
-40
lines changed

11 files changed

+214
-40
lines changed

RECORD.md

+8-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
数据仓库,持有 `AppDatabase``MediatorLiveData`Products
1212

1313
* ProductListFragment
14-
14+
1515
1、 创建 `DataBinding` mBinding 。
1616
2、通过 `ProductListViewModel.Factory` 创建 `ProductListViewModel`
1717
3、订阅 vm 内的 `LiveData`、用于更新 DataBinding 的 `ObservableField` 和手动更新数据。
@@ -46,19 +46,22 @@
4646

4747
1、AndroidInjectionModule
4848

49-
This module should be installed in the component that is used to inject the {android.app.Application} class.
49+
*This module should be installed in the component that is used to inject the {android.app.Application} class.*
50+
51+
你还可以用 AndroidSupportInjectionModule
5052

5153
2、MainActivityModule
5254

55+
*@ContributesAndroidInjector(modules = [FragmentBuildersModule::class])*
5356

5457
3、AppModule
5558

56-
提供 Service、Db、Dao的单例注入,依赖 `ViewModelModule`
57-
ViewModelModule 是 VM相关的
59+
*提供 Service、Db、Dao的单例注入,依赖 `ViewModelModule`
60+
ViewModelModule 是 VM相关的*
5861

5962
4、AppComponent
6063

61-
通过 @Component.Builder 增加builder方法,提供Application 注入方法。
64+
*通过 @Component.Builder 增加builder方法,提供Application 注入方法。*
6265

6366

6467

app/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ dependencies {
5454
//dagger
5555
implementation "com.google.dagger:dagger:${dagger_version}"
5656
kapt "com.google.dagger:dagger-compiler:${dagger_version}"
57+
implementation "com.google.dagger:dagger-android-support:${dagger_version}"
58+
kapt "com.google.dagger:dagger-android-processor:${dagger_version}"
5759

5860
//HTTP retrofit2
5961
implementation "com.squareup.retrofit2:retrofit:${retrofit_version}"

app/src/main/AndroidManifest.xml

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@
2020

2121
<activity
2222
android:name=".module.main.MainActivity"
23-
android:screenOrientation="portrait"/>
24-
<activity
25-
android:name=".module.login.LoginActivity"
2623
android:screenOrientation="portrait">
2724
<intent-filter>
2825
<action android:name="android.intent.action.MAIN" />
2926
<category android:name="android.intent.category.LAUNCHER" />
3027
</intent-filter>
3128
</activity>
29+
<activity
30+
android:name=".module.login.LoginActivity"
31+
android:screenOrientation="portrait">
32+
</activity>
3233

3334
</application>
3435

Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
package com.shuyu.github.kotlin
22

3+
import android.app.Activity
34
import android.app.Application
45
import android.content.Context
56
import com.mikepenz.iconics.context.IconicsContextWrapper
67
import com.mikepenz.iconics.Iconics
78
import com.shuyu.github.kotlin.common.style.GSYIconfont
9+
import com.shuyu.github.kotlin.di.AppInjector
10+
import dagger.android.DispatchingAndroidInjector
11+
import dagger.android.HasActivityInjector
12+
import javax.inject.Inject
813

914

10-
class GSYGithubApplication : Application() {
15+
class GSYGithubApplication : Application(), HasActivityInjector {
1116

17+
@Inject
18+
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
1219

1320
override fun attachBaseContext(base: Context?) {
1421
super.attachBaseContext(IconicsContextWrapper.wrap(base))
@@ -17,8 +24,11 @@ class GSYGithubApplication : Application() {
1724
override fun onCreate() {
1825
super.onCreate()
1926

27+
AppInjector.init(this)
2028
///初始化图标库
2129
Iconics.init(applicationContext)
2230
Iconics.registerFont(GSYIconfont())
2331
}
32+
33+
override fun activityInjector() = dispatchingAndroidInjector
2434
}

app/src/main/java/com/shuyu/github/kotlin/common/net/RetrofitFactory.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class RetrofitFactory private constructor() {
6969
@Volatile
7070
private var mRetrofitFactory: RetrofitFactory? = null
7171

72-
val instance: RetrofitFactory?
72+
val instance: RetrofitFactory
7373
get() {
7474
if (mRetrofitFactory == null) {
7575
synchronized(RetrofitFactory::class.java) {
@@ -78,11 +78,11 @@ class RetrofitFactory private constructor() {
7878
}
7979

8080
}
81-
return mRetrofitFactory
81+
return mRetrofitFactory!!
8282
}
8383

8484
fun <T> createService(service: Class<T>): T {
85-
return instance!!.retrofit.create(service)
85+
return instance.retrofit.create(service)
8686
}
8787

8888
fun <T> executeResult(observable: Observable<Response<T>>, subscriber: ResultObserver<T>) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.shuyu.github.kotlin.di
2+
3+
import android.app.Application
4+
import com.shuyu.github.kotlin.GSYGithubApplication
5+
import com.shuyu.github.kotlin.common.net.RetrofitFactory
6+
import com.shuyu.github.kotlin.di.annotation.ActivityScope
7+
import com.shuyu.github.kotlin.module.main.MainActivity
8+
import dagger.BindsInstance
9+
import dagger.Component
10+
import dagger.Module
11+
import dagger.Provides
12+
import dagger.android.ContributesAndroidInjector
13+
import dagger.android.support.AndroidSupportInjectionModule
14+
import retrofit2.Retrofit
15+
import javax.inject.Singleton
16+
17+
/**
18+
* Created by guoshuyu
19+
* Date: 2018-09-30
20+
*/
21+
22+
@Singleton
23+
@Component(modules = [
24+
AndroidSupportInjectionModule::class,
25+
AppModule::class,
26+
ActivityBindModule::class
27+
])
28+
interface AppComponent {
29+
@Component.Builder
30+
interface Builder {
31+
@BindsInstance
32+
fun application(application: Application): Builder
33+
34+
fun build(): AppComponent
35+
}
36+
37+
fun inject(gsyGithubApplication: GSYGithubApplication)
38+
}
39+
40+
@Module
41+
class AppModule {
42+
@Singleton
43+
@Provides
44+
fun providerRetrofit(): Retrofit {
45+
return RetrofitFactory.instance.retrofit
46+
}
47+
}
48+
49+
50+
@Module
51+
abstract class ActivityBindModule {
52+
53+
@ActivityScope
54+
@ContributesAndroidInjector(modules = [MainActivityModule::class])
55+
abstract fun mainActivityInjector(): MainActivity
56+
57+
}
58+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.shuyu.github.kotlin.di
2+
3+
import android.app.Activity
4+
import android.app.Application
5+
import android.os.Bundle
6+
import android.support.v4.app.Fragment
7+
import android.support.v4.app.FragmentActivity
8+
import android.support.v4.app.FragmentManager
9+
import com.shuyu.github.kotlin.GSYGithubApplication
10+
import dagger.android.AndroidInjection
11+
import dagger.android.support.AndroidSupportInjection
12+
import dagger.android.support.HasSupportFragmentInjector
13+
14+
/**
15+
* Created by guoshuyu
16+
* Date: 2018-09-30
17+
*/
18+
object AppInjector {
19+
fun init(githubApp: GSYGithubApplication) {
20+
DaggerAppComponent.builder().application(githubApp)
21+
.build().inject(githubApp)
22+
githubApp.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
23+
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
24+
handleActivity(activity)
25+
}
26+
27+
override fun onActivityStarted(activity: Activity) {
28+
29+
}
30+
31+
override fun onActivityResumed(activity: Activity) {
32+
33+
}
34+
35+
override fun onActivityPaused(activity: Activity) {
36+
37+
}
38+
39+
override fun onActivityStopped(activity: Activity) {
40+
41+
}
42+
43+
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {
44+
45+
}
46+
47+
override fun onActivityDestroyed(activity: Activity) {
48+
49+
}
50+
})
51+
}
52+
53+
private fun handleActivity(activity: Activity) {
54+
if (activity is HasSupportFragmentInjector) {
55+
AndroidInjection.inject(activity)
56+
}
57+
if (activity is FragmentActivity) {
58+
activity.supportFragmentManager
59+
.registerFragmentLifecycleCallbacks(
60+
object : FragmentManager.FragmentLifecycleCallbacks() {
61+
override fun onFragmentCreated(
62+
fm: FragmentManager,
63+
f: Fragment,
64+
savedInstanceState: Bundle?
65+
) {
66+
if (f is Injectable) {
67+
AndroidSupportInjection.inject(f)
68+
}
69+
}
70+
}, true
71+
)
72+
}
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright (C) 2017 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.shuyu.github.kotlin.di
18+
19+
/**
20+
* Marks an activity / fragment injectable.
21+
*/
22+
interface Injectable
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
package com.shuyu.github.kotlin.module.main
1+
package com.shuyu.github.kotlin.di
22

3+
import android.app.Application
34
import android.content.Context
45
import android.graphics.Color
56
import android.support.v4.app.Fragment
6-
import com.mikepenz.fontawesome_typeface_library.FontAwesome
77
import com.mikepenz.iconics.IconicsDrawable
88
import com.shuyu.github.kotlin.R
99
import com.shuyu.github.kotlin.common.style.GSYIconfont
10+
import com.shuyu.github.kotlin.module.main.MainActivity
1011
import com.shuyu.github.kotlin.module.main.dynamic.DynamicFragment
1112
import dagger.Component
1213
import dagger.Module
@@ -20,53 +21,41 @@ import devlight.io.library.ntb.NavigationTabBar
2021

2122

2223
@Module
23-
class MainProviderModule() {
24-
25-
private lateinit var context: Context
26-
27-
constructor(context: Context) : this() {
28-
this.context = context
29-
}
30-
24+
class MainActivityModule {
3125

3226
@Provides
3327
fun providerMainFragmentList(): List<Fragment> {
3428
return listOf(DynamicFragment(), DynamicFragment(), DynamicFragment())
3529
}
3630

3731
@Provides
38-
fun providerMainTabModel(): List<NavigationTabBar.Model> {
32+
fun providerMainTabModel(application: Application): List<NavigationTabBar.Model> {
3933
return listOf(
4034
NavigationTabBar.Model.Builder(
41-
IconicsDrawable(context)
35+
IconicsDrawable(application)
4236
.icon(GSYIconfont.Icon.GSY_MAIN_DT)
4337
.color(Color.RED)
4438
.sizeDp(20),
4539
Color.parseColor("#00000000"))
46-
.title(context.getString(R.string.tabDynamic))
40+
.title(application.getString(R.string.tabDynamic))
4741
.build(),
4842
NavigationTabBar.Model.Builder(
49-
IconicsDrawable(context)
43+
IconicsDrawable(application)
5044
.icon(GSYIconfont.Icon.GSY_MAIN_QS)
5145
.color(Color.RED)
5246
.sizeDp(20),
5347
Color.parseColor("#00000000"))
54-
.title(context.getString(R.string.tabRecommended))
48+
.title(application.getString(R.string.tabRecommended))
5549
.build(),
5650
NavigationTabBar.Model.Builder(
57-
IconicsDrawable(context)
51+
IconicsDrawable(application)
5852
.icon(GSYIconfont.Icon.GSY_MAIN_MY)
5953
.color(Color.RED)
6054
.sizeDp(20),
6155
Color.parseColor("#00000000"))
62-
.title(context.getString(R.string.tabMy))
56+
.title(application.getString(R.string.tabMy))
6357
.build()
6458
)
6559

6660
}
6761
}
68-
69-
@Component(modules = [MainProviderModule::class])
70-
interface MainActivityComponent {
71-
fun inject(activity: MainActivity)
72-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.shuyu.github.kotlin.di.annotation
2+
3+
4+
import javax.inject.Scope
5+
6+
/**
7+
* Created by guoshuyu
8+
* Date: 2018-09-30
9+
*/
10+
@Scope
11+
@kotlin.annotation.MustBeDocumented
12+
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
13+
annotation class ActivityScope

0 commit comments

Comments
 (0)