在 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 中 MVC、MVP 和 MVVM 对比

Android进阶之MVVM+DataBinding框架模式(更新中)

Android MVVM 设计模式示例

Android、MVVM:在 ViewModel 中调用 ContentResolver

Android MVVM 设计模式

android mvvm 角色分别都有哪些担任