观察员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 }