Observer onChanged nunca llamado

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 triggenetworking } }) mViewModel.init() // <-- here mViewModel has changed } 

El mViewModel se confirma para cambiar. Sin embargo, nunca se llama al onChanged del observador.


Pregunta : ¿por qué no funciona?


Editar : 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) } } 

Edit2 :

Para llegar a mencionar, getBar ya devuelve LiveData

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

Y el onChange aún no se dispara.

Edit3 :

 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 

No hay método de observación para el tipo Lista .
El ViewModel no tiene nada que ver con la observación tampoco, principalmente tiene un estado que persiste a través de cambios de configuration.

Para datos observables, quiere objects LiveData (Mutable) . Estos son conscientes del ciclo de vida y manejan observadores para sus datos.

Por favor vea los ejemplos de código aquí :

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

Entonces, el problema es que cuando llamas al método init , reasigna una nueva instancia de LiveData a LiveData . Y ha asignado un observador a la instancia previa de mBar porque está llamando al método init después de:

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

Para resolver el problema, solo inicialice MutableLiveData con MutableLiveData y luego cambie su valor ( No vuelva a asignar mBar con otra instancia ).

Verifique el siguiente código:

 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 } 

Ok, entonces he logrado encontrar la respuesta.

Si va a extender AppCompatActivity y desea utilizar LiveData , deberá implementar la interfaz LifecycleRegistryOwner y su único método: getLifecycle .

El problema fue que:

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

Tenía que ser:

 val mLifecycleRegistry = LifecycleRegistry(this) .. override fun getLifecycle(): LifecycleRegistry { return mLifecycleRegistry } 
  • El método no se llama, no hay error, tal vez tiene que ver con generics / objects complementarios / inheritance / concurrency / en línea
  • Kotlin Coroutines en un service de Android
  • ¿Dónde se aloja la antigua especificación de Kotlin?
  • Kotlin, proguard, Android Architecture Components
  • ¿Por qué no encuentra Guice mi encuadernación List <Interface>?
  • Poner elemento en HashMap con interfaz de map
  • set de caracteres de los valores de los attributes en Jsoup
  • La configuration regional de Spring Boot Controller no cambia con el parámetro
  • ¿Cómo replace webView por webView personalizado?
  • Aspectj no funciona con kotlin
  • Diseño de expresiones regulares multilínea