我是 mvvm 模式的新手。我为主要活动创建了一个 ViewModel。现在我想在主活动中获取 ViewModel 的一个实例。
Stackoverflow 上的大多数教程和答案都建议使用ViewModelProviders.of(...,但已弃用。
因此,根据stackoverflow上的这个问题:ViewModelProviders is deprecated in 1.1.0 main activity in onCreate,我执行以下操作(我可以发誓我已经运行了它):mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
但是,我收到一个错误消息,告诉我没有找到合适的构造函数。
error: no suitable constructor found for ViewModelProvider(MainActivity)
或者,绝对清楚,MainActivity 应为 ViewModelStoreOwner,我创建了一个变量
ViewModelStoreOwner vmso = this;并将该变量放入构造函数中,如下所示:
mainActivityViewModel = new ViewModelProvider(vmso).get(MainActivityViewModel.class);
目前我androidx.lifecycle:lifecycle-extensions从2.2.0-alpha01to更新版本2.2.0,它显示 ViewModelProviders 已被弃用。那么在 kotlin 中使用ViewModelProviders的替代方法是什么?
在我内部,我Fragment初始化一个ViewModelusing ViewModelProviders。我希望它采用Activityif否则null,否则采用(Fragment)。
private val viewModel: MainViewModel by lazy {
ViewModelProviders.of(activity ?: this).get(MainViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)
使用提供的参数不能调用以下任何函数。
- 在androidx.lifecycle.ViewModelProviders中定义的(片段)
- 在androidx.lifecycle.ViewModelPro中定义的(FragmentActivity)
似乎该语言不允许我调用冲突的方法签名(在of(Activity)和之间of(Fragment)。(这是可以理解的,也许编译器必须仅引用一个方法并且不能在同一行上链接到这两个方法。)是吗?
我现在必须使用
activity?.let {
ViewModelProviders.of(it).get(MainViewModel::class.java)
} ?: run {
ViewModelProviders.of(this).get(MainViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)
有什么更好的方法吗?
'ViewModelProviders' 已从 androidx.lifecycle:lifecycle-*:2.2.0-alpha03 https://developer.android.com/jetpack/androidx/releases/lifecycle#2.2.0-alpha03 中弃用 这里是 Kotlin 'ViewModelProviders' 的解决方案 已弃用。将 Lifecycle-extensions:2.1.0 升级到 2.2.0-alpha05 之后 ,Java 版本是什么?ViewModelProvider(this).get(MyViewModel.class) 不适用于 Java。