在 android 中使用 MVVM 设计模式时出错找不到符号类 ViewModel
Posted
技术标签:
【中文标题】在 android 中使用 MVVM 设计模式时出错找不到符号类 ViewModel【英文标题】:Error cannot find symbol class ViewModel while using MVVM design pattern in android 【发布时间】:2020-02-06 18:03:52 【问题描述】:我刚刚创建了一个演示项目,用于学习和 MVVM 以及如何在我们的项目中使用 Mvvm。 但是我在运行项目时发现了一个错误
错误:找不到符号类 ViewModel 错误:包 ViewModel 不存在 错误:包 ViewModel 不存在 错误:包 ViewModel 不存在
这是我的代码
public class User extends BaseObservable
String email,password;
boolean isDataValidate;
public String getEmail()
return email;
public void setEmail(String email)
this.email = email;
public String getPassword()
return password;
public void setPassword(String password)
this.password = password;
public boolean isDataValidate()
return !TextUtils.isEmpty(getEmail())&& Patterns.EMAIL_ADDRESS.matcher(getEmail()).matches()&&
getPassword().length()>6;
public void setDataValidate(boolean dataValidate)
isDataValidate = dataValidate;
这是我的 ViewModel 类
public class LoginViewModel extends ViewModel
private User user;
private LoginResultCallback loginResultCallback;
public LoginViewModel(LoginResultCallback loginResultCallback)
this.loginResultCallback=loginResultCallback;
this.user=new User();
public String getEmailText1()
return user.getEmail();
public String getPasswordText1()
return user.getPassword();
public TextWatcher getEmailText()
return new TextWatcher()
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
@Override
public void afterTextChanged(Editable editable)
user.setEmail(editable.toString());
;
public TextWatcher getPasswordText()
return new TextWatcher()
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
@Override
public void afterTextChanged(Editable editable)
user.setPassword(editable.toString());
;
public void onLoginClicked(View view)
if (user.isDataValidate())
loginResultCallback.onSuccess("Login was Successfull");
else
loginResultCallback.onError("Login Invalid Credential");
这是我的 MainActivity
public class MainActivity extends AppCompatActivity implements LoginResultCallback
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
ActivityMainBinding activityMainBinding= DataBindingUtil.setContentView(this,R.layout.activity_main);
LoginViewModel loginViewModel=new LoginViewModel(this);
activityMainBinding.setViewModel(loginViewModel);
//activityMainBinding.setViewModel(ViewModelProviders.of(this,new LoginViewModelFactory(this)).get(LoginViewModel.class));
@Override
public void onSuccess(String Message)
Toast.makeText(this, ""+Message, Toast.LENGTH_SHORT).show();
@Override
public void onError(String Error)
Toast.makeText(this, ""+Error, Toast.LENGTH_SHORT).show();
这里是 viewModelFactory 类
public class LoginViewModelFactory extends ViewModelProvider.NewInstanceFactory
private LoginResultCallback loginResultCallback;
public LoginViewModelFactory(LoginResultCallback loginResultCallback)
this.loginResultCallback=loginResultCallback;
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass)
return (T) new LoginViewModel(loginResultCallback);
XML 就在这里
<?xml version="1.0" encoding="utf-8"?>
<data>
<variable
name="viewModel"
type="com.example.designinfpattern.ViewModel.LoginViewModel" />
</data>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<EditText
android:id="@+id/email"
android:layout_
android:layout_
app:addTextChangedListener="@viewModel.emailText"
android:hint="Enter Your account Email or Username"
/>
<EditText
android:id="@+id/password"
android:layout_
android:layout_
android:hint="Enter Your account password"
app:addTextChangedListener="@viewModel.passwordText" />
</LinearLayout>
<Button
android:id="@+id/login_button"
android:layout_
android:layout_
android:onClick="@viewModel::onLoginClicked"
android:text="Login" />
</LinearLayout>
这是我在构建 Gradle 文件中使用的依赖项: 实现 'androidx.lifecycle:lifecycle-extensions:2.1.0'
我不知道如何解决这个错误,我正在做研发但没有找到合适的解决方案。请帮我解决问题
提前致谢
【问题讨论】:
我的一个项目中发生了同样的错误,我只是将包名ViewModel
更改为viewmodel
全部小写,它得到了解决。 Viewmodel
也会出现同样的错误。
【参考方案1】:
您需要将 ViewModel 文件夹(包)从 ViewModel 重命名为 viewmodel
【讨论】:
这是一个问题吗?在问下一个问题之前,请点击此链接:***.com/help/how-to-ask。谢谢【参考方案2】:在你的 build.gradle 中添加以下内容
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"
// alternatively - just ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:2.1.0"
【讨论】:
@Swayangit 我已经更新了代码并添加了对问题的依赖,请检查此 @Swayangit 同样的问题 你能分享你的两个 build.gradle 文件吗?【参考方案3】:今天,我在 MVVM 中遇到了同样的问题。我解决了这个问题。一切正常,突然我开始遇到同样的错误。然后我回想起我最近做了什么改变。然后我意识到我将我的活动文件从一个包移动到另一个包之后,我盯着这个问题。在布局中,我相应地更改了我的视图模型包和宾果游戏!分享它可能会帮助并节省其他人的时间,以防将来发生同样的事情。
【讨论】:
以上是关于在 android 中使用 MVVM 设计模式时出错找不到符号类 ViewModel的主要内容,如果未能解决你的问题,请参考以下文章
Android进阶之MVVM+DataBinding框架模式(更新中)