繁体   English   中英

使用 Hilt 注入 viewModel 时不调用 init

[英]init is not called when injecting viewModel using Hilt

我想在 ViewModel 初始化时发出 API 请求。 这就是为什么我在init方法中发出 API 请求的原因; 当我在 Activity 中注入 viewModel 时,期望会触发init 我究竟做错了什么?

主视图模型.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)
    }
}

您误解了注入的代表。

private val mainViewModel : MainViewModel by viewModels() // injecting viewModel (Wrong)

这不是匕首/刀柄注射。 这是对 AndroidKTX 提供的惰性委托的调用。 所以你得到的行为是预期的,当你第一次访问属性mainViewModel时,你的 ViewModel 将被创建(而不是注入)。 因此,您的 init {} 块的时间是预期的。

来自 Dagger/Hilt 的文档( https://dagger.dev/hilt/view-model.html

警告:即使视图 model 具有 @Inject 构造函数,直接从 Dagger 请求它(例如,通过字段注入)也是错误的,因为这会导致多个实例。 必须通过 ViewModelProvider API 检索视图模型。 这在编译时由 Hilt 进行检查。

您可以做的是在您的onCreate方法中访问mainViewModel ,这将尽早触发init块。 或者手动移除委托并在onCreate中初始化mainViewModel

mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM