我正在构建一个食品订购应用程序,我有一个CartItem列表
data class CartItemData(
@PrimaryKey
val cartItemId: String = UUID.randomUUID().mostSignificantBits.toString(),
val userId: String,
val foodId: String,
val price: Double,
val quantity: Int)
字符串
我想使用cartItem中的食物ID从Firebase Realtime Database中检索食物数据,然后将其显示给用户。
下面是我的代码从数据库中获取食物数据
fun getFood(
foodId: String,
onGetFoodSuccess: (FoodData) -> Unit
) {
foodsRef.orderByChild("id").equalTo(foodId).addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
snapshot.children.forEach { shot ->
Log.d(TAG, shot.value.toString())
val data = shot.getValue(FoodData::class.java)
data?.let(onGetFoodSuccess)
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
型
这是我的购物车视图模型
class CartViewModel : ViewModel() {
private val fireBaseRepository = FireBaseRepository.get()
private val cartRepository = CartRepository.get()
private val _cartState = MutableStateFlow(CartState())
val cartState: StateFlow<CartState> = _cartState.asStateFlow()
init {
getCart()
}
fun getFood(
foodId: String,
onGetFoodSuccess: (FoodData) -> Unit
) {
fireBaseRepository.getFood(
foodId = foodId,
onGetFoodSuccess = onGetFoodSuccess
)
}
private fun getCart() {
viewModelScope.launch {
cartRepository.getCart().collect {cartItems ->
_cartState.value = _cartState.value.copy(
cartItems = cartItems,
)
}
}
}
}
型
我不知道如何从实时数据库中检索数据,并在从SQLite数据库中获取购物车数据后将其传递到视图中。
1条答案
按热度按时间0vvn1miw1#
首先,我强烈建议你检查firebase是否正确地在快照上检索,否则可能是你的配置有问题。此外,如果在这一点上:
字符串
这个日志正在检索数据,我可以假设主要问题是这个Map:
val data = shot.getValue(FoodData::class.java)
,可能你没有打得那么好,因为这个值是得到空的,而不是调用回调。我的建议是检查从firebase快照的结果,并检查您的数据类FoodData
是否定义正确,提醒设置其默认值,否则该应用程序将崩溃.检查此文档的进一步解释.现在,如果您的问题是处理回调以检索到ui,则更简单。您可以在compose视图中使用cartState,并将collect作为可组合对象的状态,因此每当此stateFlow更改其值时,可组合对象将重新绘制,请查看:https://developer.android.com/jetpack/compose/state#use-other-types-of-state-in-jetpack-compose