Observer onChanged никогда не вызывал

FooActivity.kt :

class FooActivity : AppCompatActivity(), LifecycleRegistryOwner { override fun getLifecycle(): LifecycleRegistry { return LifecycleRegistry(this) } .. // <-- here mViewModel is null mViewModel.getBar().observe(this, Observer<List<String>> { override fun onChanged(bar: List<String>) { // Never triggered } }) mViewModel.init() // <-- here mViewModel has changed } 

Подтверждено изменение mViewModel . Однако onChanged никогда не вызывается.


Вопрос : почему он не работает?


Изменить : FooViewModel.kt :

 class FooViewModel(application: Application) : AndroidViewModel(application) { val baz: BazPagerAdapter? = null .. fun init(fm: FragmentManager) { mBar = listOf("1", "2", "3") } .. fun getBar(): List<String> = mBar .. fun setBaz(pager: ViewPager, periods: List<BazFragment>) { pager.adapter = BazPagerAdapter(mFragmentManager!!, periods) } } 

Редактировать2 :

Для получения упоминания getBar уже возвращает LiveData

 fun getBar(): LiveData<List<String>> = mBar 

И onChange все равно не срабатывает.

Редактировать 3 :

 class FooViewModel(application: Application) : AndroidViewModel(application) { private var mBar: MutableLiveData<List<String>>? = null .. fun init(fragmentManager: FragmentManager) { .. if (mBar == null) { mBar = MutableLiveData<List<String>>() } mBar?.value = periods } .. fun getBar(): LiveData<List<String>>? = mBar 

Для типа List нет метода наблюдения.
ViewModel не имеет ничего общего с наблюдением, но в основном это состояние, которое сохраняется через изменения конфигурации.

Для наблюдаемых данных вы хотите (Mutable) объекты LiveData . Это информация о жизненном цикле и управление наблюдателями для их данных.

Пожалуйста, смотрите примеры кода здесь :

 public class MyViewModel : ViewModel() { private val mBar = MutableLiveData<List<String>>() fun getBar(): LiveData<List<String>> = mBar fun init() { mBar.setValue(listOf("1", "2", "3")) } } 

Таким образом, проблема заключается в том, когда вы вызываете метод init , он переназначает новый экземпляр LiveData в mBar . И вы назначили наблюдателя для предыдущего экземпляра mBar потому что вы вызываете метод init после:

  mViewModel.getBar().observe(this, Observer<List<String>> { override fun onChanged(bar: List<String>) { // Never triggered } }) 

Чтобы решить проблему, просто инициализируйте mBar с помощью MutableLiveData а затем измените ее значение ( не переназначайте mBar другим экземпляром ).

Проверьте следующий код:

 class FooViewModel(application: Application) : AndroidViewModel(application) { private var mBar: MutableLiveData<List<String>> = MutableLiveData() fun init(fragmentManager: FragmentManager) { mBar.value = periods // Changing value only, not new instance } fun getBar(): LiveData<List<String>> = mBar } 

Хорошо, поэтому мне удалось найти ответ.

Если вы собираетесь расширить AppCompatActivity и хотите использовать LiveData , вам придется реализовать интерфейс LifecycleRegistryOwner и единственный метод – getLifecycle .

Проблема заключалась в том, что:

 override fun getLifecycle(): LifecycleRegistry { return LifecycleRegistry(this) } 

Должно быть:

 val mLifecycleRegistry = LifecycleRegistry(this) .. override fun getLifecycle(): LifecycleRegistry { return mLifecycleRegistry } 
Intereting Posts
Передача любого в массив в Котлин Kotlin JS Переопределение «внешней» функции с необязательными параметрами Доступ к статической функции расширения из другого класса в Котлине? Kotlin: Разница между объектом и сопутствующим объектом в классе Как построить шаблон строителя вокруг компонентов JavaFX в Котлине Как написать файл в Котлине? Котлин – Проблемы с while () Переменные деструктурирования Kotlin не работают с Pair, Triple или классом данных Есть ли способ сортировки ключей groupBy в rx-java / kotlin? Единый котлинский + libgdx-код для развертывания на Android, рабочий стол и браузер? DSL-подобный OnClick-прослушиватель для пользовательского представления с использованием kotlin в Android Есть ли чистый DRY способ обновления нескольких текстовых элементов из HTTP-запроса JSON? RequiresApi vs TargetApi андроид андроид как интегрировать kotlin с node.js Проверьте, является ли класс допустимым значением для KParameter