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(){}我想在MainActivity.
MainActivityViewModel类,目前在上面的代码中,我已经在MainActivity中实例化了MainActivityViewModel,但我想使用dagger-hilt.执行同样的操作。
发布于 2021-01-16 18:11:19
更新: @ViewModelInject已经很老了,所以使用下面的代码注入viewModel。
@HiltViewModel
class MainActivityViewModel @Inject constructor( private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
...
}首先,为什么要在主活动中注入viewModel?
在活动或片段中初始化viewModel的最佳方法是:
private val mainActivityViewModel: MainActivityViewModel by viewModels()使用implementation "androidx.core:core-ktx:X.Y.Z"依赖项
但是无论如何,如果您想要注入视图模型
您应该首先提供 viewmodel 来提供视图模型,至少您需要有生命周期所有者,它可以是活动或片段。
如果您需要在MusicPlaybackConnection中注入MainActivityViewModel
您需要提供MusicPlaybackConnection
@ActivityScoped
@Provides
fun provideMusicPlaybackConnection(
@ActivityContext context: Context,
serviceComponentName: ComponentName): MusicPlaybackConnection =
MusicPlaybackConnection(context, serviceComponentName)然后在MainActivityViewModel类中
class MainActivityViewModel @ViewModelInject constructor(
private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
...
}希望我的回答能帮到你。
https://stackoverflow.com/questions/65654733
复制相似问题