Обозреватель не вызывается при изменении LiveData - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть список собак, и когда я нажимаю на конкретную собаку из списка, я вижу детали. Однако по какой-то причине текстовые представления (dogName, dogPurpose, dogLifespan и др. c.) Не обновлены. Фрагмент сведений отображает только значения по умолчанию, заданные макетом XML. В чем может быть проблема?

class DetailFragment : Fragment() {

    private var dogUuid = 0
    private lateinit var viewModel: DetailViewModel

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        arguments?.let {
            dogUuid = DetailFragmentArgs.fromBundle(it).dogUuid
        }

        viewModel = ViewModelProviders.of(this).get(DetailViewModel::class.java)
        viewModel.fetch(dogUuid)

        observeViewModel()
    }

    private fun observeViewModel(){
        viewModel.dogLiveData.observe(this, Observer{ dog ->
            dog?.let {
                dogName.text = dog.dogBreed
                dogPurpose.text = dog.bredFor
                dogTemperament.text = dog.temperament
                dogLifespan.text = dog.lifeSpan
                context?.let {dogImage.loadImage(dog.imageUrl, getProgressDrawable(it))}
            }
        })
    }
}

Это DetailViewModel.

class DetailViewModel(application: Application): BaseViewModel(application) {
    val dogLiveData = MutableLiveData<DogBreed>()

    fun fetch(uuid: Int){
        launch {
            val dog = DogDatabase(getApplication()).dogDao().getDog(uuid)
            dogLiveData.value = dog
        }
    }
}

Вот моя реализация сопрограмм.

abstract class BaseViewModel(application: Application): AndroidViewModel(application), CoroutineScope {

    private val job = Job()

    override val coroutineContext: CoroutineContext
        get() = job + Dispatchers.Main

    override fun onCleared() {
        super.onCleared()
        job.cancel()
    }
}

Кажется, что Observer внутри наблюдатьViewModel () никогда не звонил. Почему?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Добавить observeViewModel() Перед viewModel.fetch(dogUuid)

class DetailFragment : Fragment() {

    private var dogUuid = 0
    private lateinit var viewModel: DetailViewModel

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        arguments?.let {
            dogUuid = DetailFragmentArgs.fromBundle(it).dogUuid
        }

        viewModel = ViewModelProviders.of(this).get(DetailViewModel::class.java)

 observeViewModel()

 viewModel.fetch(dogUuid)


    }

    private fun observeViewModel(){
        viewModel.dogLiveData.observe(this, Observer{ dog ->
            dog?.let {
                dogName.text = dog.dogBreed
                dogPurpose.text = dog.bredFor
                dogTemperament.text = dog.temperament
                dogLifespan.text = dog.lifeSpan
                context?.let {dogImage.loadImage(dog.imageUrl, getProgressDrawable(it))}
            }
        })
    }
}
0 голосов
/ 01 марта 2020

Проблема заключалась в том, что я забыл передать аргумент uuid в DetailFragment, в результате чего dog объект стал нулевым в DetailViewModel.fetch(uuid). Следовательно, приведенный выше код является правильным, и проблема была в другом месте.

0 голосов
/ 25 февраля 2020

Можете ли вы подтвердить, что линия

dogLiveData.value = dog

вызывается с точкой останова?

Попробуйте позвонить

viewModel.fetch(dogUuid)

после

observeViewModel()
...