File tree Expand file tree Collapse file tree 5 files changed +29
-52
lines changed
app/src/main/java/com/kotlin/mvvm Expand file tree Collapse file tree 5 files changed +29
-52
lines changed Original file line number Diff line number Diff line change 11package 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
64import 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}
Original file line number Diff line number Diff line change @@ -12,27 +12,13 @@ import javax.inject.Singleton
1212
1313@Singleton
1414class 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}
Original file line number Diff line number Diff line change @@ -5,6 +5,7 @@ import com.kotlin.mvvm.di.modules.AppModule
55import dagger.BindsInstance
66import dagger.Component
77import dagger.android.AndroidInjectionModule
8+ import dagger.android.AndroidInjector
89import 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}
Original file line number Diff line number Diff line change @@ -3,20 +3,20 @@ package com.kotlin.mvvm.di.modules
33import androidx.lifecycle.ViewModel
44import androidx.lifecycle.ViewModelProvider
55import com.kotlin.mvvm.di.base.ViewModelFactory
6- import com.kotlin.mvvm.di.base.ViewModelKey
76import com.kotlin.mvvm.ui.countries.CountriesViewModel
87import com.kotlin.mvvm.ui.news.NewsViewModel
98import dagger.Binds
9+ import dagger.MapKey
1010import dagger.Module
1111import dagger.multibindings.IntoMap
12+ import kotlin.reflect.KClass
1213
1314/* *
1415 * Created by Waheed on 04,November,2019
1516 */
1617
1718@Module
1819abstract 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 >)
Original file line number Diff line number Diff line change 11package com.kotlin.mvvm.ui
22
3- import androidx.appcompat.app.AppCompatActivity
4- import androidx.fragment.app.Fragment
53import androidx.lifecycle.ViewModelProvider
6- import dagger.android.DispatchingAndroidInjector
7- import dagger.android.support.HasSupportFragmentInjector
4+ import dagger.android.support.DaggerAppCompatActivity
85import 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}
You can’t perform that action at this time.
0 commit comments