Как связаться между viewModel и MainActivity через привязку данных? - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь реализовать архитектуру MVVM в Котлине, используя привязку данных. код просто показывает пустой экран в качестве вывода. Может ли кто-нибудь помочь мне выяснить, почему при выполнении этой программы нет вызова на сервер.

Я попытался это и ссылки, подобные этой, чтобы решить эту проблему.

Мой код выглядит следующим образом:

MainActivity

class MainActivity : AppCompatActivity() {

private var cvViewModel: CvViewModel? = null
private var model: Model?= null
private var liveData: LiveData<Model>? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding : ActivityMainBinding= DataBindingUtil.setContentView(this, R.layout.activity_main)
   // setContentView(R.layout.activity_main)
    cvViewModel= ViewModelProviders.of(this).get(CvViewModel::class.java)
    liveData= cvViewModel.getNewsRepository()
}

}

class CvRepository {

private val apiCall: ApiCall=
    RetrofitClient.cteateService(ApiCall::class.java)


fun getCvDetails(): MutableLiveData<Model> {
    val cvData = MutableLiveData<Model>()
    apiCall.getCvData().enqueue(object : Callback<Model> {
        override fun onResponse(call: Call<Model>,
                                response: Response<Model>
        ) {
            if (response.isSuccessful) {
                Log.e("abc", ""+response.body().toString())
                cvData.value = response.body()
            }
        }

        override fun onFailure(call: Call<Model>, t: Throwable) {
            cvData.value = null
        }
    })
    return cvData
}

companion object {

    private var cvRepository: CvRepository ? = null

    val instance: CvRepository
        get() {
            if (cvRepository == null) {
                cvRepository = CvRepository()
            }
            return this.cvRepository as CvRepository
        }
}

}

class CvViewModel: ViewModel(){

private var mutableLiveData: MutableLiveData<Model>? = null
private var cvRepository: CvRepository? = null

fun init() {
    if (mutableLiveData != null) {
        return
    }
    cvRepository = CvRepository.instance
    mutableLiveData = cvRepository!!.getCvDetails()
}

fun getNewsRepository(): LiveData<Model>? {
    return mutableLiveData
}

}

1 Ответ

1 голос
/ 09 ноября 2019

Ваш getCvDetails() внутри CvRepository возвращает пустой список, поскольку enqueue является асинхронным. Вот почему данные не заполняются в вашем представлении.

Попробуйте напрямую передать репозиторий LiveData в Activity из ViewModel

fun getNewsRepository(): LiveData<Model>? {
    return CvRepository.instance.getCvDetails()
}

И затем наблюдайте за изменениями в Activity

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    ...

    liveData= cvViewModel.getNewsRepository()
    liveData?.observe(this, Observer { items ->
         //Do your operation here
    })
}
...