Sumit Shukla
Sumit Shukla

Reputation: 4494

Inject dependency for a class using dagger hilt

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(){}

Upvotes: 0

Views: 2082

Answers (1)

Narek Hayrapetyan
Narek Hayrapetyan

Reputation: 1929

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.

Upvotes: 1

Related Questions