使用匕首柄为 class 注入依赖项
Inject dependency for a class using dagger hilt
- 我正在尝试在我的 Android 应用程序中实施
dagger-hilt
。现在我的应用程序中有四个 classes 但我在为它创建依赖项时感到困惑。
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
class
- 注意: 目前在上面的代码中我已经在
MainActivity
中实例化了 MainActivityViewModel
,但是我想使用 dagger 来做同样的事情-hilt.
更新:
@ViewModelInject 太旧了,所以使用下面的代码来注入 viewModel。
@HiltViewModel
class MainActivityViewModel @Inject constructor( private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
...
}
首先为什么要在 main activity 中注入 viewModel?
在 activity 或片段中初始化 viewModel 的最佳方法是:
private val mainActivityViewModel: MainActivityViewModel by viewModels()
使用 implementation "androidx.core:core-ktx:X.Y.Z"
依赖项
但是无论如何如果你想注入viewmodel
你应该先提供viewModel来提供viewmodel至少你需要有lifecycle owner,可以是activity或fragment
如果需要在MainActivityViewModel
中注入MusicPlaybackConnection
您需要提供MusicPlaybackConnection
@ActivityScoped
@Provides
fun provideMusicPlaybackConnection(
@ActivityContext context: Context,
serviceComponentName: ComponentName): MusicPlaybackConnection =
MusicPlaybackConnection(context, serviceComponentName)
然后在 MainActivityViewModel class
class MainActivityViewModel @ViewModelInject constructor(
private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
...
}
希望我的回答对您有所帮助
- 我正在尝试在我的 Android 应用程序中实施
dagger-hilt
。现在我的应用程序中有四个 classes 但我在为它创建依赖项时感到困惑。
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
. 中使用匕首柄注入 - 注意: 目前在上面的代码中我已经在
MainActivity
中实例化了MainActivityViewModel
,但是我想使用 dagger 来做同样的事情-hilt.
MainActivityViewModel
class
更新: @ViewModelInject 太旧了,所以使用下面的代码来注入 viewModel。
@HiltViewModel
class MainActivityViewModel @Inject constructor( private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
...
}
首先为什么要在 main activity 中注入 viewModel?
在 activity 或片段中初始化 viewModel 的最佳方法是:
private val mainActivityViewModel: MainActivityViewModel by viewModels()
使用 implementation "androidx.core:core-ktx:X.Y.Z"
依赖项
但是无论如何如果你想注入viewmodel
你应该先提供viewModel来提供viewmodel至少你需要有lifecycle owner,可以是activity或fragment
如果需要在MainActivityViewModel
中注入MusicPlaybackConnection您需要提供MusicPlaybackConnection
@ActivityScoped
@Provides
fun provideMusicPlaybackConnection(
@ActivityContext context: Context,
serviceComponentName: ComponentName): MusicPlaybackConnection =
MusicPlaybackConnection(context, serviceComponentName)
然后在 MainActivityViewModel class
class MainActivityViewModel @ViewModelInject constructor(
private val _playbackConnection: MusicPlaybackConnection) : ViewModel() {
...
}
希望我的回答对您有所帮助