如何在ViewModel中同步改造?

时间:2019-12-28 04:17:57

标签: android android-mvvm

我正在研究mvvm。当我调用init()时,第一个调用为null。 使用改造,我认为原因是函数getIndexRetrofit()在行执行data.value = res之前返回。因此,我想对此进行同步,希望函数返回的不是空值而是响应值。当我单击按钮时,值'binding.user !!。login'为空。

存储库:

fun getIndexRetrofit(name:String) : MutableLiveData<UserModel>{   

    Retrofit2Service.getService().requestUserInfo(name).enqueue(object: Callback<UserModel> {
        override fun onFailure(call: Call<UserModel>, t: Throwable) {
           data.postValue(null)
        }
        override fun onResponse(call: Call<UserModel>, response: Response<UserModel>) {
            if(response.body()!=null) {
                var res = response.body()!!

                data.value = res
            }
        }
    })//Retrofit

    return data
}

ViewModel:

    lateinit var mIndexModel : MutableLiveData<UserModel>
    lateinit var mRepository : MainRepository

    fun init(name:String){
        mRepository =  MainRepository().getInstance()
        mIndexModel = mRepository.getIndexRetrofit(name)
        //Log.d("TAG",mIndexModel.value.toString())
    }

    fun getIndexList(): MutableLiveData<UserModel> {
        return mIndexModel
    }

OnCreate:

 mainViewModel= ViewModelProviders.of(this).get(MainViewModel::class.java)
        mainViewModel.init("ckdrb7017")
        mainViewModel.getIndexList().observe(this, Observer<UserModel>(){
                t->
            if(t==null){
                Log.d("TAG","NULL");
            }else{
                Log.d("TAG","SUCCESS");
                binding.user=t
            }

        })

        binding.url.setOnClickListener(View.OnClickListener {
            var intent = Intent(this, SecondActivity::class.java)
            intent.putExtra("userId", binding.user!!.login)
            startActivity(intent)
        })


1 个答案:

答案 0 :(得分:0)

分配用户后尝试使用binding.executePendingBindings()

binding.user=t
binding.executePendingBindings()

但是好的做法是在Activity/Fragment中使用另一个变量来保存UserModel,并在intent中使用该变量

private userModel: UserModel? = null
...

userModel = t
binding.user=t
binding.executePendingBindings()

然后

var intent = Intent(this, SecondActivity::class.java)
intent.putExtra("userId", userModel?.login)
startActivity(intent)