Skip to content

Commit 7c2aac1

Browse files
committed
- For dagger2.27 no need HasActivityInjector, extending DaggerApplication
- AndroidInjector interface is given for injection to AppComponent -
1 parent e6c24c6 commit 7c2aac1

File tree

5 files changed

+29
-52
lines changed

5 files changed

+29
-52
lines changed
Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,17 @@
11
package com.kotlin.mvvm.app
22

3-
import android.app.Activity
4-
import android.app.Application
5-
import com.kotlin.mvvm.di.base.AppInjector
3+
import com.kotlin.mvvm.di.components.DaggerAppComponent
64
import dagger.android.AndroidInjector
7-
import dagger.android.DispatchingAndroidInjector
8-
import dagger.android.HasActivityInjector
9-
import javax.inject.Inject
5+
import dagger.android.support.DaggerApplication
106

117
/**
128
* Created by Waheed on 04,November,2019
139
*/
1410

15-
class App : Application(), HasActivityInjector {
11+
class App : DaggerApplication() {
1612

17-
@Inject
18-
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
13+
private val applicationInjector = DaggerAppComponent.builder().application(this).build()
1914

20-
override fun onCreate() {
21-
super.onCreate()
15+
override fun applicationInjector(): AndroidInjector<out DaggerApplication> = applicationInjector
2216

23-
AppInjector.init(this)
24-
}
25-
26-
override fun activityInjector(): AndroidInjector<Activity> {
27-
return dispatchingAndroidInjector
28-
}
2917
}

app/src/main/java/com/kotlin/mvvm/di/base/ViewModelFactory.kt

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,13 @@ import javax.inject.Singleton
1212

1313
@Singleton
1414
class ViewModelFactory @Inject constructor(
15-
private val creators: @JvmSuppressWildcards Map<Class<out ViewModel>, Provider<ViewModel>>
15+
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
1616
) : ViewModelProvider.Factory {
17-
1817
override fun <T : ViewModel> create(modelClass: Class<T>): T {
19-
var creator: Provider<out ViewModel>? = creators[modelClass]
20-
if (creator == null) {
21-
for ((key, value) in creators) {
22-
if (modelClass.isAssignableFrom(key)) {
23-
creator = value
24-
break
25-
}
26-
}
27-
}
28-
if (creator == null) {
29-
throw IllegalArgumentException("unknown model class $modelClass")
30-
}
31-
try {
32-
@Suppress("UNCHECKED_CAST")
33-
return creator.get() as T
34-
} catch (e: Exception) {
35-
throw RuntimeException(e)
36-
}
18+
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
19+
modelClass.isAssignableFrom(it.key)
20+
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
21+
@Suppress("UNCHECKED_CAST")
22+
return creator.get() as T
3723
}
3824
}

app/src/main/java/com/kotlin/mvvm/di/components/AppComponent.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.kotlin.mvvm.di.modules.AppModule
55
import dagger.BindsInstance
66
import dagger.Component
77
import dagger.android.AndroidInjectionModule
8+
import dagger.android.AndroidInjector
89
import javax.inject.Singleton
910

1011
/**
@@ -17,7 +18,7 @@ import javax.inject.Singleton
1718
*/
1819
@Singleton
1920
@Component(modules = [AndroidInjectionModule::class, AppModule::class])
20-
interface AppComponent {
21+
interface AppComponent : AndroidInjector<App> {
2122

2223
@Component.Builder
2324
interface Builder {
@@ -28,6 +29,6 @@ interface AppComponent {
2829
fun build(): AppComponent
2930
}
3031

31-
fun inject(app: App)
32+
override fun inject(app: App)
3233

3334
}

app/src/main/java/com/kotlin/mvvm/di/modules/ViewModelModule.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@ package com.kotlin.mvvm.di.modules
33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.ViewModelProvider
55
import com.kotlin.mvvm.di.base.ViewModelFactory
6-
import com.kotlin.mvvm.di.base.ViewModelKey
76
import com.kotlin.mvvm.ui.countries.CountriesViewModel
87
import com.kotlin.mvvm.ui.news.NewsViewModel
98
import dagger.Binds
9+
import dagger.MapKey
1010
import dagger.Module
1111
import dagger.multibindings.IntoMap
12+
import kotlin.reflect.KClass
1213

1314
/**
1415
* Created by Waheed on 04,November,2019
1516
*/
1617

1718
@Module
1819
abstract class ViewModelModule {
19-
2020
/**
2121
* Binding NewsArticleViewModel using this key "NewsArticleViewModel::class"
2222
* So you can get NewsArticleViewModel using "NewsArticleViewModel::class" key from factory
@@ -40,3 +40,13 @@ abstract class ViewModelModule {
4040
@Binds
4141
abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
4242
}
43+
44+
@MustBeDocumented
45+
@Target(
46+
AnnotationTarget.FUNCTION,
47+
AnnotationTarget.PROPERTY_GETTER,
48+
AnnotationTarget.PROPERTY_SETTER
49+
)
50+
@Retention(AnnotationRetention.RUNTIME)
51+
@MapKey
52+
annotation class ViewModelKey(val value: KClass<out ViewModel>)
Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package com.kotlin.mvvm.ui
22

3-
import androidx.appcompat.app.AppCompatActivity
4-
import androidx.fragment.app.Fragment
53
import androidx.lifecycle.ViewModelProvider
6-
import dagger.android.DispatchingAndroidInjector
7-
import dagger.android.support.HasSupportFragmentInjector
4+
import dagger.android.support.DaggerAppCompatActivity
85
import javax.inject.Inject
96

107
/**
118
* Created by Waheed on 04,November,2019
9+
* Updated to dagger 2.27, 29, September 2020
1210
*/
1311

1412
// Referring this class as BaseActivity
@@ -18,14 +16,8 @@ typealias BaseActivity = DaggerActivity
1816
/**
1917
* Activity providing Dagger support and [ViewModel] support
2018
*/
21-
abstract class DaggerActivity : AppCompatActivity(), HasSupportFragmentInjector {
22-
23-
@Inject
24-
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
19+
abstract class DaggerActivity : DaggerAppCompatActivity() {
2520

2621
@Inject
2722
lateinit var viewModelFactory: ViewModelProvider.Factory
28-
29-
override fun supportFragmentInjector() = dispatchingAndroidInjector
30-
3123
}

0 commit comments

Comments
 (0)