Reputation: 4494
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(){}
MainActivityViewModel
class using dagger-hilt inside MainActivity
.MainActivityViewModel
inside MainActivity
, but I want to do same using dagger-hilt.Upvotes: 0
Views: 2082
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