Anc*_*ora 72 android viewmodel
我一直在尝试在 Activity 中创建 ViewModel 对象,但不推荐使用 ViewModelProviders 那么创建 ViewModel 对象的替代方法是什么。
Kno*_*wIT 126
简单替换:
这个:
boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
有了这个:
boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
小智 41
这个 Gradle 升级给我带来了问题。
从
implementation 'androidx.core:core:1.1.0'
Run Code Online (Sandbox Code Playgroud)
到
implementation 'androidx.core:core:1.2.0'
Run Code Online (Sandbox Code Playgroud)
主要活动 Java/Kotlin 文件
这个导入语句
import androidx.lifecycle.ViewModelProviders
Run Code Online (Sandbox Code Playgroud)
必须改为
import androidx.lifecycle.ViewModelProvider
Run Code Online (Sandbox Code Playgroud)
这个 KOTLIN viewModel 语句
viewModel = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
必须改为
viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
在 JAVA 中
这行JAVA代码
mViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);
Run Code Online (Sandbox Code Playgroud)
必须改为
mViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
Run Code Online (Sandbox Code Playgroud)
然后这一切都对我有用。
Joh*_*ohn 28
直接使用 ViewModelProvider 构造函数,因为它们现在处理默认的 ViewModelProvider.Factory 角色。
爪哇
mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
Run Code Online (Sandbox Code Playgroud)
科特林
mainActivityViewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
Ami*_*nak 10
而不是ViewModelProviders
我们现在应该使用ViewModelProvider
构造函数,它有三个:
public ViewModelProvider(ViewModelStoreOwner owner)
public ViewModelProvider(ViewModelStoreOwner owner, Factory factory)
public ViewModelProvider(ViewModelStore store, Factory factory)
Run Code Online (Sandbox Code Playgroud)
1.如果您使用的不是ViewModelProvider.Factory
来传递额外的参数给你ViewModel
,你可以使用第一个。所以:
viewModel = ViewModelProviders.of(this).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)
可以替换为:
viewModel = new ViewModelProvider(this).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)
AppCompatActivity
并且不同种类的Fragment
s 是的间接子类ViewModelStoreOwner
(请参阅此处已知子类的完整列表),因此您可以在此构造函数中使用它们。
2.但是如果你使用 a ViewModelProvider.Factory
,你应该使用第二个或第三个构造函数:
viewModel = ViewModelProviders.of(this, viewModelFactory).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)
可以替换为:
viewModel = new ViewModelProvider(this, viewModelFactory).get(YouViewModel.class);
Run Code Online (Sandbox Code Playgroud)
或基于上文档的ViewModelStore
:
使用 ViewModelStoreOwner.getViewModelStore() 检索活动和片段的 ViewModelStore。
viewModel = new ViewModelProvider(getViewModelStore(), viewModelFactory).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)
ViewModelProviders.of() 已被弃用。您可以将 Fragment 或 FragmentActivity 传递给新的 ViewModelProvider(ViewModelStoreOwner) 构造函数以实现相同的功能。(aosp/1009889)
为了java
:
只需替换这个:
viewModel = ViewModelProviders.of(this).get(YOUR_VIEW_MODEL::class.java)
Run Code Online (Sandbox Code Playgroud)
有了这个:
viewModel = ViewModelProvider(this).get(YOUR_VIEW_MODEL::class.java)
如果你有自己的工厂那么
viewModel =
ViewModelProvider(this,YOUR_FACTORY).get(YOUR_VIEW_MODEL::class.java)
Run Code Online (Sandbox Code Playgroud)
对于kotlin
:有一个更好的方法来做到这一点。您可以在应用程序中添加以下依赖项build.gradle
:
//for activity
implementation "androidx.activity:activity-ktx:1.3.0-alpha06"
//for fragment
implementation "androidx.fragment:fragment-ktx:1.3.2"
Run Code Online (Sandbox Code Playgroud)
然后访问视图模型,如下所示:
private val viewmodel: YOUR_VIEW_MODEL by viewModels()
Run Code Online (Sandbox Code Playgroud)
如果你有自己的视图模型工厂,
private val viewmodel: YOUR_VIEW_MODEL by viewModels { YOUR_VIEW_MODEL_FACTORY }
Run Code Online (Sandbox Code Playgroud)
接下来几个月的简单选择是坚持使用稳定版或测试版。ViewModelProviders
仅从 , 开始弃用2.2.0
,目前在一个alpha03
版本中。
因为当您移动到2.2.0
生命周期依赖项或更高版本时,您的选择取决于您的语言:
如果您使用的是 Java,请使用ViewModelProvider()
构造函数,传入您的活动或片段
如果您使用的是 Kotlin,则应该有一个by viewModels()
属性委托,尽管我没有在源代码中找到它...
如果您使用的是 Kotlin,而不是:
private lateinit var viewModel: EntityGridViewModel
[...]
// Deprecated
viewModel = ViewModelProviders.of(this).get(EntityGridViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
你可以使用更好的:
private val viewModel: EntityGridViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
这段代码对我有用
private lateinit var viewModel: MainViewModel
viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
41871 次 |
最近记录: |