android livedata Observer 没有通知

android livedata Observer didn't notified

大家好,这是我对 livedata 的第一次拍摄,如果你能帮我找出这个 Observer 有什么问题,我将不胜感激

我的 MainActivity 中的 Observer 部分无法接收到任何东西,从我的 Dialogfragment 和 MainModel class 到 MainViewModel 一切正常,我已经触发了日志,但是 MainActivity 中的 Observer 没有任何反应

class MainModel {
    private var resultLiveData = MutableLiveData<List<Course>>()
    private val courseList = ArrayList<Course>()
    private val mainViewModel = MainViewModel()
    fun sum(course: Course) {
        courseList.add(course)
        resultLiveData.value = courseList
        Log.d("tag", "$course in model")
        mainViewModel.loadedResult(resultLiveData)
        Log.d("tag", "${resultLiveData.value} in my model")
    }
}
class MainViewModel : ViewModel() {
     var result = MutableLiveData<List<Course>>()

    fun loadedResult(resultData: MutableLiveData<List<Course>>) {
        result = resultData
        Log.d("tag", "main viewModel ${result.value}")
        Log.d("tag", "main viewModel ${resultData.value}")

    }
}
class MainActivity : AppCompatActivity() {

    private lateinit var fragmentManager: FragmentManager
    private lateinit var linearLayoutManager: LinearLayoutManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        linearLayoutManager = LinearLayoutManager(this)
        mainRecyclerView.layoutManager = linearLayoutManager
        fragmentManager = supportFragmentManager

        setupLivedata()
        floatingActionButton.setOnClickListener {
            showAddDialog()
        }
    }

    private fun setupLivedata() {
        val mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        var myList : ArrayList<Course>

        var myObserver = Observer<List<Course>> {
            observedList -> myList = observedList as ArrayList<Course>
            Log.d("tag", "${myList.size} reached main activity")
            Log.d("tag", "${observedList.size} reached main activity")

        }
        mainViewModel.result.observe(this, myObserver)
    }

    private fun showAddDialog() {
        val inputDialog = InputDialogFragment()
        inputDialog.show(supportFragmentManager, "input")
    }
}

MainModel.mainViewModelMainActivity.mainViewModel 是不同的实例。

你不应该这样使用 ViewModel

private val mainViewModel = MainViewModel()

您正在更改 MainViewModel 中的 LiveData 参考:

result = resultData

使用 LiveData,您需要 setValue/postvalue 新项目才能真正触发观察者。

像这样:

class MainViewModel : ViewModel() {
     val result = MediatorLiveData<List<Course>>()

    fun loadedResult(resultData: MutableLiveData<List<Course>>) {
        result.addSource(resultData, { resultObj ->
             result.setValue(resultObj);
        });
        Log.d("tag", "main viewModel ${result.value}")
        Log.d("tag", "main viewModel ${resultData.value}")

    }
}

建议:最好保持 LiveData 不可变,一旦创建就不要更改。并且只更新值。