【问题标题】:Unable to instantiate ViewModel in Android无法在 Android 中实例化 ViewModel
【发布时间】:2021-04-20 08:53:45
【问题描述】:

我正在尝试在我的应用程序中实现 MVVM 设计模式。我已经创建了视图模型和存储库类,但是当我尝试在我的 MainActivity 中实例化视图模型时,它在下面的行中实例化时在 MainActivity 下方显示错误红线.

pdfViewModel = new ViewModelProvider(MainActivity.this).get(PdfViewModel.class);

下面是我的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    PdfViewModel pdfViewModel;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    pdfViewModel = new ViewModelProvider(MainActivity.this).get(PdfViewModel.class);

 }
}

PdfViewModel.java

public class PdfViewModel extends AndroidViewModel {

private PdfRepository pdfRepository;

public PdfViewModel(@NonNull Application application) {
    super(application);
    pdfRepository = new PdfRepository(application);
}

public LiveData<List<Pdfs>> getAllPdfs(){
    return pdfRepository.getMutableLiveData();
}
}

PdfRepository.java

public class PdfRepository {

private ArrayList<Pdfs> list = new ArrayList<>();
private MutableLiveData<List<Pdfs>> mutableLiveData = new MutableLiveData<>();
private Application application;

public PdfRepository(Application application){
    this.application = application;
}

public MutableLiveData<List<Pdfs>>  getMutableLiveData(){

    SharedPreferences preferences = application.getSharedPreferences("Credentials", Context.MODE_PRIVATE);
    String email = preferences.getString("email",null);

    Retrofit retrofit = RetrofitClient.getInstance();
    ApiService apiService = retrofit.create(ApiService.class);

    Call<List<Pdfs>> call = apiService.getFiles(email);

    call.enqueue(new Callback<List<Pdfs>>() {
        @Override
        public void onResponse(Call<List<Pdfs>> call, Response<List<Pdfs>> response) {

            if(response.body() != null){
                list = (ArrayList<Pdfs>) response.body();
                mutableLiveData.setValue(list);
            }
        }

        @Override
        public void onFailure(Call<List<Pdfs>> call, Throwable t) {

            TastyToast.makeText(application,t.getMessage(),TastyToast.LENGTH_SHORT,TastyToast.ERROR).show();
        }
    });

    return mutableLiveData;
}

}

以上代码中需要修正什么?

【问题讨论】:

  • 错误说明了什么?
  • 什么都没有显示,只是一条红线
  • 你能不能只用this替换MainActivity.this
  • 你编译代码了吗?你有编译错误吗?如果是,请提供错误。或者,您可以单击红线并观察出现一个红灯泡。然后点击灯泡寻找可能的解决方案。
  • 在更改为this 时,它的说法无法解析构造函数

标签: java android mvvm android-livedata android-viewmodel


【解决方案1】:

您的代码正在尝试创建 ViewModelProvider 类的新实例(使用 new 关键字),这不是实例化 ViewModel 的正确方法。

MainActivity 上,而不是:

pdfViewModel = new ViewModelProvider(MainActivity.this).get(PdfViewModel.class);

尝试:

pdfViewModel = ViewModelProviders.of(this).get(PdfViewModel.class);

请注意,正确的类是ViewModelProviders(末尾带有“s”),您需要调用静态方法of,而不是使用new 创建它的新实例。如果您无法导入该类,请确保已将依赖项“androidx.lifecycle:lifecycle-extensions:2.2.0”添加到 app/build.gradle

为了使您的代码更加清晰,我建议您了解 Kotlin KTX 方法 viewModels,如 here 所述。不过,您需要使用 Kotlin。

【讨论】:

  • ViewModelProviders 没有出现在建议中,而是 ViewModelProvider 出现了。
  • 尝试将 'androidx.lifecycle:lifecycle-extensions:2.2.0' 添加到您的模块 build.gradle。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多