我在 ViewModel 中创建函数以避免在使用 Flow 和 LiveData 时重复。在示例中,我创建了一个扩展函数,如下所示。在和朋友聊天的时候,我们开始思考把它作为参数使用和通过返回来使用的区别,但是我没有找到太多相关信息。哪种方法是正确的?
inline fun <reified T> FirebaseRemoteConfig.fetchToLiveData(
key: String,
gson: Gson,
liveData: MutableLiveData<T>
) {
this.fetchAndActivate().addOnCompleteListener {
if (it.isSuccessful) {
val keyString = this.getString(key)
val type = object : TypeToken<T>() {}.type
val jsonModel = gson.fromJson<T>(keyString, type)
liveData.postValue(jsonModel)
}
}
}
inline fun <reified T> FirebaseRemoteConfig.fetchToLiveData(
key: String,
gson: gson
): LiveData<T> {
val liveData = MutableLiveData<T>()
this.fetchAndActivate().addOnCompleteListener {
if (it.isSuccessful) {
val keyString = this.getString(key)
val type = object : TypeToken<T>() {}.type
val jsonModel = gson.fromJson<T>(keyString, type)
liveData.postValue(jsonModel)
}
}
return liveData
}
如果您多次调用该函数以更改正在观察的 LiveData 的发布值,则第一种方法很有意义。但如果你不是,那就很复杂了。
第二种方式看起来不错……
除非您可以通过使用
liveData { }
协程构建器和 await()
调用而不是侦听器来改善内存使用。这将使 API 调用可取消,并在 ViewModel 超出范围时自动取消。对于第一种方法,这是不可行的,您可能想要启动一个协程并在其中使用 await 来更新实时数据。