观察员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也与观察无关,主要是有通过配置改变持续的状态。

对于需要(可变)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 } }) 

要解决这个问题,只需使用MutableLiveData初始化mBar ,然后更改其值( 不要将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 }