无法从存储库的片段中观察 LiveData
Not able to observe LiveData in fragment from Repository
我正在尝试通过视图模型从存储库中观察我的片段中包含在 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);
}
})
这里的问题是您不应该 return 来自存储库部分的 LiveData。为什么?参考这个 link 的原因 (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),其值只能在视图模型中更改(因为它是私有的),另一个 LiveData (postUploadLiveData) public 并分配 MutableLiveData 值,将是通过 activity 或片段观察并且是不可变的。
现在调用此 ViewModel 的 getPostUploaded 函数并传递两个变量 postMap 和 postId 并观察 postUploadLiveData 实时数据
我正在尝试通过视图模型从存储库中观察我的片段中包含在 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);
}
})
这里的问题是您不应该 return 来自存储库部分的 LiveData。为什么?参考这个 link 的原因 (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),其值只能在视图模型中更改(因为它是私有的),另一个 LiveData (postUploadLiveData) public 并分配 MutableLiveData 值,将是通过 activity 或片段观察并且是不可变的。
现在调用此 ViewModel 的 getPostUploaded 函数并传递两个变量 postMap 和 postId 并观察 postUploadLiveData 实时数据