[英]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.