如何访问存储库中的上下文 [MVVM]

Jos*_*zet 8 java android mvvm dagger-2

我正在开发一个使用 MVVM 架构的 Android 应用程序。我的问题是我的存储库(负责从 Web 获取 JSON)需要访问上下文。

我已经阅读了有关 StackOverflow 的一些建议。到目前为止,我收集到的最合理的选择如下:

  • 使用 Dagger 2 以某种方式注入上下文。

  • 让我ViewModel从扩展AndroidViewModel中获取应用程序上下文并将其传递给存储库。

截至目前,我有一个ViewModel和一个Repo

RoomFragmentViewModel.java:

public class MyViewModel extends ViewModel {
    private MutableLiveData<List<JSONObject>> rooms;
    private Repository repository;

    public void init(){
        if(rooms != null){
            return;
        }
        repository = repository.getInstance();
        rooms = repository.getRooms();
    }

Run Code Online (Sandbox Code Playgroud)

存储库.java:

public class Repository {

    private static Repository instance;
    private ArrayList<JSONObject> actualRooms = new ArrayList<>();


    public static Repository getInstance() {
        if (instance == null) {
            instance = new Repository();
        }
        return instance;
    }

   
    public MutableLiveData<List<JSONObject>> getRooms() {
        ...
    }

    private void setRooms() {
        ...
        // Here I am fetching data from my server, but in order to to do so I require a context

        String url = "http://10.0.0.5:8000/api";

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
                (Request.Method.GET, null, new Response.Listener<JSONObject>() {...

        // Context needs to be provided right here:
        MySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);

    }
}

Run Code Online (Sandbox Code Playgroud)

由于互联网上的说法相互矛盾,我不确定我应该如何解决这个问题。如果您的答案使用了 dagger,那么您能不能很好地提供代码解释,因为我对 dagger 完全陌生。先感谢您。

Jos*_*zet 4

我最终通过 dagger 注入了上下文。然而,从我的角度来看,进行ViewModel扩展AndroidViewModel也是一种有效的选择,而且绝对是更容易的选择。如果我正在开发一个简单且小型的应用程序,我可能会建议直接扩展AndroidViewModel以避免来自 dagger 的不必要的样板代码。

我遵循了codingwithmith的dagger系列来实现我自己的解决方案。因此,他的频道可能对未来的读者有用: https://www.youtube.com/channel/UCoNZZLhPuuRteu02rh7bzsw/featured