android - 使用 Hilt 注入(inject) viewModel 时不调用 init

标签 android kotlin dependency-injection dagger dagger-hilt

我想在 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)并初始化mainViewModelonCreate手动。
mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

关于android - 使用 Hilt 注入(inject) viewModel 时不调用 init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66839757/

相关文章:

kotlin - 为什么我不能在插件{}中使用val?

scala - 添加和扩展通用编写器特征以进行逐步数据存储的最佳方法

android - 使用 PhoneGap 的 FileTransfer 传递 cookie

java - 在未附加到 Activity 的 Fragment 中调用 Activity 方法

java - Android 初学者 - 在 DragEvent 中放置图像

kotlin - 映射单个对象的惯用方式

gradle - 为什么更新 Gradle 到 3.1.0 后显示 "3rd-party Gradle plug-ins may be the cause"?

java - 使用Retrofit从json获取数据

c# - 工作单元的依赖注入(inject)

angularjs - 模块之间的 Angular 依赖关系