我正在尝试在 ViewModel 类中传递一个构造函数参数。但我不明白这样做的最佳方法。请看一下代码和评论,让我知道最简单和合适的方法。
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
// Question 1: How can I pass constructor parameter if I use this delegate feature?
// private lateint var viewModel: MainViewModel by viewModels()
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val repository = Repository()
// Passing constructor directly works.
viewModel = MainViewModel(repository)
// Question 2: Why do I need this factory class / method as it works without these two lines.
// val viewModelFactory = MainViewModelFactory(repository)
// viewModel = ViewModelProvider(this, viewModelFactory).get(MainViewModel::class.java)
viewModel.getPost()
viewModel.mResponse.observe(this, Observer { response ->
if (response.isSuccessful) {
Log.d("Response: ", response.body()?.userId.toString())
Log.d("Response: ", response.body()?.id.toString())
binding.textView.text = response.body()?.title.toString()
Log.d("Response: ", response.body()?.body.toString())
} else {
Log.d("Response: ", response.errorBody().toString())
binding.textView.text = response.code().toString()
}
})
}
}
最佳答案
// Question 1: How can I pass constructor parameter if I use this delegate feature?
// private lateint var viewModel: MainViewModel by viewModels()
您会将您的 ViewModelFactory
作为 a parameter to viewModels()
传递.或者,根据参数的性质,使用依赖倒置框架(Dagger/Hilt、Koin 等)。在您的情况下,您似乎正在传递某种存储库,在这种情况下,依赖倒置框架是一种流行的解决方案。
// Question 2: Why do I need this factory class / method as it works without these two lines.
因为它实际上不起作用。特别是,MainViewModel
实例无法在配置更改(例如,屏幕旋转)后继续存在。如果您想正确使用 Jetpack ViewModel
系统,ViewModel
系统必须实例化您的 MainViewModel
。
关于android - 为什么我在 android 中需要 ViewModelFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69508208/