【问题标题】:android livedata Observer didn't notifiedandroid livedata Observer 没有通知
【发布时间】:2021-02-14 00:53:42
【问题描述】:

大家好,这是我第一次接触 livedata,如果你能帮我找出这个 Observer 的问题,我将不胜感激

我的 MainActivity 中的 Observer 部分无法接收任何内容,从我的 Dialogfragment 和 MainModel 类到 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")
    }
}

【问题讨论】:

  • 根据你的实现值resultnever 改变。那么,如何获得通知?从您的onCreate 拨打loadedResult 并检查

标签: android kotlin android-livedata android-viewmodel


【解决方案1】:

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

你不应该像这样使用 ViewModel

private val mainViewModel = MainViewModel()

【讨论】:

  • 感谢您的回答,但我应该如何在我的 Model 类中访问 MainViewModel?并将其数据发送到活动
  • 将其作为构造函数参数或函数参数接收
【解决方案2】:

您正在此行更改 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 不可变,一旦创建就不要更改它。只需更新值。

【讨论】:

  • 感谢您的回答,但没有像 addSource 这样的功能,我必须自己创建吗?
  • 对不起,我不得不为 viewmodel 属性使用 MediatorLiveData 而不是 Mutable。我现在更新了答案,应该没问题
  • 将 mutableLivedata 更改为 mediatorLivedata 并通过从片段中插入第二个数据,我的应用程序崩溃了,这是日志 paste.ubuntu.ir/pdyy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多