Android MVVM:无法实例化视图模型
Posted
技术标签:
【中文标题】Android MVVM:无法实例化视图模型【英文标题】:Android MVVM: Cannot instantiate viewmodel 【发布时间】:2021-09-26 22:52:11 【问题描述】:我是 MVVM 新手,正在尝试将它一点一点地实现到我的应用程序中,为此我已经开始在 YouTube 上观看一些 MVVM 教程,但是在尝试将视图模型实例化到我的应用程序中时遇到了问题活动。
我已经知道,从 2021 年开始,build.gradle 中不再需要生命周期导入,实际上 ViewModel 类会自动检测并导入,就像在下一个类中一样:
import androidx.lifecycle.ViewModel;
public class LoginViewModel extends ViewModel
然后在我的 LoginActivity 类中,我尝试用下一种方式实例化虚拟机:
LoginViewModel loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);
但它抱怨“this”不能转换为 ViewModelStoreOwner。
有什么问题?
编辑 1:
我尝试了@dominicoder,如果我在我的 BaseActivity 类中扩展 AppCompatActivity 它可以工作,但我得到了
"You need to use a Theme.AppCompat theme (or descendant) with this activity"
应用启动时出现异常,但无法在 AndroidManifest 中设置 AppCompat 主题,因为我已经为自定义标题操作栏使用了一个主题。
android:theme="@style/Theme.myTheme.TitleBar"
无论如何,我也尝试了下一个@Sniffer 建议(以防万一)无济于事:
How to fix: "You need to use a Theme.AppCompat theme (or descendant) with this activity"
这是否意味着我无法将我的应用迁移到 MVVM 架构?
扩展 AppCompatActivity 是唯一的解决方案吗??
【问题讨论】:
确保您从 AppCompatActivity 扩展您的活动 【参考方案1】:但它抱怨“this”不能转换为 ViewModelStoreOwner。
我做错了什么?
您提供的参数类型与预期不同。
您的问题不完整,因为您没有显示this
是什么,但显然它不是 ViewModelStoreOwner
。
查看the documentation for this class,您可以看到所有扩展它的类的列表。您的 this
必须是这些类之一,或者您定义的扩展这些类之一的类。
如果您在定义的 Activity 中,它应该扩展 AppCompatActivity
。
如果您在定义的 Fragment 中,它应该扩展 Fragment
。
【讨论】:
感谢@dominicoder,我在扩展 Activity 而不是 AppCompactActivity。如果我扩展 AppCompactActivity 它不再抱怨,但是一旦我的应用程序启动它就会引发类型异常:您需要在此活动中使用 Theme.AppCompat 主题(或后代)。在我的 MainActivity 中。我没有在我的应用程序中使用 Theme.AppCompat,我必须从现在开始吗?我应该将它包含在清单中还是在哪里?事实是我已经在我的 AndroidManifest.xml 中使用了 android:theme="@style/Theme.myTheme.TitleBar",并且无法删除它,因为我正在使用自定义标题栏:s 检查this@DiegoPerez 请提出一个新问题,而不是讨论现有问题。以上是关于Android MVVM:无法实例化视图模型的主要内容,如果未能解决你的问题,请参考以下文章