如何解决ViewModel 的 observe() 方法观察不正确
我正在使用 MVVM pattern
制作应用。
我正在实现一个函数,用于在单击按钮时将项目添加到 recycler view
,但我从观察者那里收到了 NullPointException
错误。
(准确地说,你按下一个按钮来切换屏幕并根据接收到的参数添加项目。)
出了什么问题......?
我引用了 this
在片段中
override fun onViewCreated(view: View,savedInstanceState
: Bundle?) {
super.onViewCreated(view,savedInstanceState)
args.workout?.let {
viewModel.addItem()
}
viewModel.item.observe(viewLifecycleOwner) { newItem ->
adapter.setItems(newItem) // error
}
}
ViewModel
class WriteRoutineViewModel : ViewModel() {
private var _item: MutableLiveData<ArrayList<RoutineModel>> = MutableLiveData()
val item: LiveData<ArrayList<RoutineModel>> = _item
fun addItem() {
_item.value?.add(RoutineModel("test","ABC"))
_item.value = _item.value
}
}
错误
2021-07-15 04:26:25.961 13731-13731/com.example.writeweight E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.writeweight,PID: 13731
java.lang.NullPointerException: newItem must not be null
at com.example.writeweight.fragment.WriteRoutineFragment$onViewCreated$4.onChanged(WriteRoutineFragment.kt:66)
at com.example.writeweight.fragment.WriteRoutineFragment$onViewCreated$4.onChanged(WriteRoutineFragment.kt:18)
at androidx.lifecycle.LiveData.considerNotify(LiveData.java:133)
at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:146)
at androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:468)
at androidx.lifecycle.LiveData$LifecycleBoundObserver.onStateChanged(LiveData.java:425)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265)
解决方法
这里的问题是,MutableLiveData<ArrayList<RoutineModel>>
设置为仅 MutableLiveData()
,尝试将其更改为 MutableLiveData(arrayListOf())
它应该可以工作:)
编辑:
原因很简单,ArrayList
甚至需要在它周围的 MutableLiveData
包装器内部进行初始化。