【问题标题】:Not able to observe LiveData in fragment from Repository无法从存储库中观察片段中的 LiveData
【发布时间】:2023-03-03 11:07:01
【问题描述】:

我正在尝试通过视图模型从存储库中观察我的片段中包含在 LiveData 中的布尔值,尽管我成功地能够在存储库中更改它的值我无法在片段中观察到它在片段中没有改变.

我的代码

存储库

 private val postUploaded: MutableLiveData<Boolean> = MutableLiveData()
        
        
postId.let { it ->
                                    FirebaseFirestore.getInstance().collection("Posts").document(it).set(postMap,
                                        SetOptions.merge())
                                        .addOnSuccessListener {
                                            postUploaded.value=true
        }
    }
        
        
        
        @JvmName("getPostUploaded")
            fun getPostUploaded(): MutableLiveData<Boolean> {
                return postUploaded
            }

视图模型

class UploadFragmentViewModel(application: Application) :AndroidViewModel(application) {

    private val authAppRepository: Repository = Repository(application)
    private val postUploaded: MutableLiveData<Boolean> = authAppRepository.getPostUploaded()


    @JvmName("getPostUploaded")
    fun getPostUploaded(): MutableLiveData<Boolean> {
        return postUploaded
    }
}

片段

mViewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory
    .getInstance(Application())).get(UploadFragmentViewModel::class.java)

mViewModel.getPostUploaded().observe(viewLifecycleOwner, {

    Log.d("MyTag", "it in upload fragment is $it")

    if (it){
        binding.lottieanim2.visibility=View.VISIBLE

        Handler(Looper.getMainLooper()).postDelayed({
            run {
                val fragment: Fragment = HomeFragment()
                            activity!!
                                .supportFragmentManager
                                .beginTransaction()
                                .replace(R.id.container, fragment)
                                .commit()

            }
        }, 2000);

    }
})

【问题讨论】:

  • 您如何验证 MutableLiveData 的值实际上在您的存储库中发生了变化?也许在 onSuccessListener 中放置一个断点以确保它实际上是成功的。顺便说一句,如果用户在 2 秒延迟期间退出片段或旋转屏幕,您在片段中的postDelayed() 调用将触发崩溃,因为activity 将为空。
  • @Tenfour04 它崩溃了好几次我只是在尝试别的东西它现在已经改变了

标签: android kotlin mvvm


【解决方案1】:

这里的问题是你不应该从 Repository 部分返回 LiveData。为什么?原因参考这个链接(https://proandroiddev.com/no-more-livedata-in-your-repository-there-are-better-options-25a7557b0730)

存储库代码

@JvmName("getPostUploaded")
    fun getPostUploaded(
        postMap: Any,
        postId: String,
        updateCallback: (Boolean) -> Unit
    ) {
        postId.let { it ->
            FirebaseFirestore.getInstance().collection("Posts").document(it).set(
                postMap,
                SetOptions.merge()
            ).addOnSuccessListener {
                updateCallback(true)
            }
        }
    }

ViewModel 代码

private var authRepository: AuthRepository = AuthRepository()
private val _postUploadLiveData = MutableLiveData<Boolean>()
var postUploadLiveData: LiveData<Boolean> = _postUploadLiveData
fun getPostUploaded(
    postMap: Any,
    postId: String
) {
    authRepository.getPostUploaded(postMap, postId) { response ->
        if (response) {
            _postUploadLiveData.postValue(response)
        }
    }
}

在这里,我使用了一个 MutableLiveData (_postUploadLiveData),其值只能在 viewmodel 内更改(因为它是私有的)和另一个 LiveData (postUploadLiveData),它是公共的并分配 MutableLiveData 值并将通过活动或片段和是不可变的。

现在调用这个 ViewModel 的 getPostUploaded 函数并传递两个变量 postMap 和 postId 并观察 postUploadLiveData 实时数据

【讨论】:

  • 虽然来自存储库的 LiveData 可能不是最好的使用模式,但它仍然有效。如果他们在没有找到原始问题的情况下迁移到不同的模式,他们仍然会遇到同样的问题。顺便说一句,没有不可变的 LiveData 这样的东西。毕竟是“活的”。 LiveData 是只读的,不是不可变的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 2020-04-02
  • 2019-08-04
  • 1970-01-01
  • 2019-06-20
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多