You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:33:24