Android:如何在ViewModel与ViewRepository之间传递参数?
问题分析与解决方案
你的核心问题在于Repository构造方法调用需要参数的getLoginUser()时未传参,同时ViewModel的getPostLoginApoya方法接收了参数却未实际传递给Repository。以下是修正后的实现方案:
1. 修正Repository代码
移除构造方法中对getLoginUser()的调用,让该方法专门负责接收参数并发起登录请求:
public class ApoyaLoginViewRepositori { private Seccion15ServerClient seccion15ServerClient; private SeccionApiService seccionApiService; private MutableLiveData<PostLoginApoya> loginApoyaUser; ApoyaLoginViewRepositori(){ seccion15ServerClient = Seccion15ServerClient.getInstance(); seccionApiService = seccion15ServerClient.getSeccionApiService(); // 此处不再初始化loginApoyaUser,留待请求时处理 } public LiveData<PostLoginApoya> getLoginUser(String tokenApoya, String usuario, String password){ // 若需要复用LiveData避免重复请求,可保留此判断;若每次请求都要刷新,可直接创建新实例 if(loginApoyaUser == null){ loginApoyaUser = new MutableLiveData<>(); } // 发起网络请求(以Retrofit为例) seccionApiService.loginApoya(tokenApoya, usuario, password) .enqueue(new Callback<PostLoginApoya>() { @Override public void onResponse(Call<PostLoginApoya> call, Response<PostLoginApoya> response) { loginApoyaUser.setValue(response.isSuccessful() ? response.body() : null); } @Override public void onFailure(Call<PostLoginApoya> call, Throwable t) { loginApoyaUser.setValue(null); // 可在此处处理请求失败逻辑,比如发送错误事件 } }); return loginApoyaUser; } // 可选:若需要重置LiveData以支持重新请求 public void resetLoginLiveData(){ loginApoyaUser = null; } }
2. 修正ViewModel代码
让getPostLoginApoya方法将接收的参数传递给Repository的对应方法,并返回请求结果的LiveData:
public class ApoyaLoginViewModel extends AndroidViewModel { private ApoyaLoginViewRepositori apoyaLoginViewRepositori; public ApoyaLoginViewModel(Application application){ super(application); apoyaLoginViewRepositori = new ApoyaLoginViewRepositori(); } public LiveData<PostLoginApoya> getPostLoginApoya(String tokenApoya, String usuario, String password){ // 直接将参数传递给Repository并返回LiveData return apoyaLoginViewRepositori.getLoginUser(tokenApoya, usuario, password); } }
3. Fragment代码保持不变
你原有的Fragment观察者代码无需修改,因为已经在调用getPostLoginApoya时传递了参数,ViewModel会将参数转发给Repository:
apoyaLoginViewModel.getPostLoginApoya(tokenApoya, usuario, password).observe(getActivity(), new Observer<PostLoginApoya>() { @Override public void onChanged(PostLoginApoya postLoginApoya) { loginApoyaModel = postLoginApoya; } });
关键说明
- 不要在Repository构造方法中处理需要动态参数的逻辑:ViewModel构造时机早于Fragment获取用户输入参数的时机,此时无法拿到
tokenApoya、usuario等参数。 - 按需控制LiveData复用:如果需要避免重复请求,可保留Repository中对
loginApoyaUser的空值判断;如果每次调用都需要发起新请求,可直接在getLoginUser中创建新的MutableLiveData实例。
内容的提问来源于stack exchange,提问作者Enrique Espinosa
相关产品推荐
相关产品推荐

