Search code examples
androidkotlinmvvmdaggerdagger-hilt

Inject dependency for a class using dagger hilt


  • I am trying to implement dagger-hilt in my Android app. Right now I have four classes in my app but I am confused while creating a dependency for it.

MainActivityViewModel.kt:

class MainActivityViewModel(
    var musicPlaybackConnection: MusicPlaybackConnection
) : ViewModel() {

    fun hello() {
        Log.d("TAG", "${musicPlaybackConnection.isConnected.value}")
    }
}

MusicPlaybackConnection.kt

class MusicPlaybackConnection(
        private val context: Context,
        serviceComponentName: ComponentName
    ) {
        var isConnected = MutableLiveData<Boolean>().apply { postValue(false) }
 

    companion object {
        @Volatile
        private var instance: MusicPlaybackConnection? = null

        fun getInstance(context: Context, serviceComponentName: ComponentName) =
            instance ?: synchronized(this) {
                instance ?: MusicPlaybackConnection(context, serviceComponentName)
                    .also { instance = it }
        }
   }
}

MainActivity.kt:

class MainActivity : AppCompatActivity() {
    
    lateinit var mainActivityViewModel: MainActivityViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(view)

       mainActivityViewModel = ViewModelProvider(
         this, MainActivityModelFactory(
            MusicPlaybackConnection.getInstance(
                this,
                ComponentName(this, MyService::class.java)
            )
         )
       ).get(MainActivityViewModel::class.java)

        mainActivityViewModel.hello()
    }
}

MyService.kt

class MyService: MediaBrowserServiceCompat(){}
  • I want to inject MainActivityViewModel class using dagger-hilt inside MainActivity.
  • Note: Currently in the above code I have instantiated MainActivityViewModel inside MainActivity, but I want to do same using dagger-hilt.

Solution

  • UPDATE: @ViewModelInject is way old, so use code below to inject viewModel.

    @HiltViewModel
    class MainActivityViewModel @Inject constructor( private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
      ...
    }
    

    First why you want to inject viewModel in main activity?

    Best way to initialize viewModel in activity or fragment is:

    private val mainActivityViewModel: MainActivityViewModel by viewModels()
    

    with using implementation "androidx.core:core-ktx:X.Y.Z" dependency

    But anyway if you want to inject viewmodel

    you should first provide the viewModel to provide viewmodel at least you need to have lifecycle owner, it can be activity or fragment

    if you need to inject MusicPlaybackConnection inside MainActivityViewModel

    You need to provide MusicPlaybackConnection

    @ActivityScoped
    @Provides
    fun provideMusicPlaybackConnection(
                           @ActivityContext context: Context,
                           serviceComponentName: ComponentName): MusicPlaybackConnection =
        MusicPlaybackConnection(context, serviceComponentName)
    

    and then in MainActivityViewModel class

     class MainActivityViewModel @ViewModelInject constructor(
        private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
              ...
        }
    

    Hope My answer will help you.