我想在 ViewModel 初始化时发出 API 请求。这就是为什么我在 init
内发出 API 请求的原因方法;期待 init
当我在 Activity 中注入(inject) viewModel 时触发。我究竟做错了什么?
MainViewModel.kt
@HiltViewModel
class MainViewModel @Inject constructor(private val mainRepository: MainRepo) : ViewModel() {
companion object {
var TAG = "MainViewModel**"
}
init {
Log.d(TAG, "NOT TRIGGERED: ")
viewModelScope.launch {
val album1: List<AlbumItem> = mainRepository.getAlbums()
}
}}
MainActivity.kt
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val mainViewModel : MainViewModel by viewModels() // injecting viewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding =
DataBindingUtil.setContentView(this, R.layout.activity_main)
}
}
最佳答案
您误解了注入(inject)的代表。
private val mainViewModel : MainViewModel by viewModels() // injecting viewModel (Wrong)
这不是 Dagger /刀柄注入(inject)。这是对 AndroidKTX 提供的惰性委托(delegate)的调用。所以你得到的行为是预期的,当你第一次访问属性 mainViewModel
时,你的 ViewModel 将被创建(而不是注入(inject))。 .因此,您的 init {} block 的时间是预期的。来自 Dagger/Hilt 的文档 (https://dagger.dev/hilt/view-model.html)
Warning: Even though the view model has an @Inject constructor, it is an error to request it from Dagger directly (for example, via field injection) since that would result in multiple instances. View Models must be retrieved through the ViewModelProvider API. This is checked at compile time by Hilt.
您可以访问
mainViewModel
在您的 onCreate
方法,这将触发 init
尽早阻止。或者删除委托(delegate)并初始化
mainViewModel
在 onCreate
手动。mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
关于android - 使用 Hilt 注入(inject) viewModel 时不调用 init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66839757/