我有两种方法,比如A和B,它们都是从Coroutine范围返回结果的,它们都是以相同的方式实现的,但是一种很好,另一种是例外。他们为什么表现得很奇怪?这是我的A方法的代码
fun addCartToFirebase(itemId: String,cart: Basket) : Pair<String,Int>?{
var pair:Pair<String,Int>? = null
CoroutineScope(IO).launch {
databaseReference.child("Cart").child("Anonymous").child(itemId).setValue(cart).addOnSuccessListener {
pair = Pair("result",1)
}
.addOnFailureListener {
pair = Pair("result",0)
}
}
return pair
}方法A工作正常,但是方法B不是working.Here是B的代码
fun submitFinalCart(cartData : HashMap<String,List<String>>) : Pair<String,Int>{
var pair:Pair<String,Int>? = null
CoroutineScope(IO).launch {
databaseReference.child("FinalCart").push().setValue(cartData).addOnSuccessListener {
pair = Pair("result",1)
}.addOnFailureListener {
pair = Pair("result",0)
}
}
return pair!!
}为什么会这样。我该怎么修呢?
编辑过的
我的ViewModel类代码
fun setCart(itemId : String, cart: Basket) : Pair<String,Int>?{
return firebaseNetwork.addCartToFirebase(itemId,cart)
}我的片段类代码
binding.addToCart.setOnClickListener {
val cart = Basket()
cart.itemsId = itemId
cart.itemWeight =binding.counter.text.toString()
val pair = selectedItemViewModel.setCart(binding.category?.id!!,cart)
Log.d("pair value",pair?.second?.toString()!!)
if(pair.second == 0){
showShortToast("Failed")
}
else{
showShortToast("Success")
binding.cartIndicator.visibility =View.VISIBLE
}
}发布于 2020-05-20 07:23:26
这是因为addCartToFirebase方法返回null。submitFinalCart也希望这样做,但是!!不允许这样做。您必须等待您的协同线完成或返回Deferred<Pair<String,Int>>
例如,您可以使用suspendCoroutine从回调获得如下结果:
suspend fun submitFinalCart(cartData: HashMap<String, List<String>>): Pair<String, Int> =
withContext(IO) {
suspendCoroutine { continuation ->
databaseReference.child("FinalCart").push().setValue(cartData).addOnSuccessListener {
continuation.resume(Pair("result", 1))
}.addOnFailureListener {
continuation.resume(Pair("result", 0))
}
}
}发布于 2020-05-20 09:48:57
你在努力做不可能的事。您希望从挂起的调用返回而不挂起您的函数。
只是让功能暂停。
suspend fun addCartToFirebase(itemId: String, cart: Basket): Boolean =
suspendCoroutine { cont ->
databaseReference.child("Cart").child("Anonymous").child(itemId).setValue(cart).addOnSuccessListener {
cont.resume(true)
}
.addOnFailureListener {
cont.resume(false)
}
}
suspend fun setCart(itemId: String, cart: Basket): Boolean =
firebaseNetwork.addCartToFirebase(itemId,cart)
// Set your listener
binding.addToCart.setOnClickListener {
val cart = Basket()
cart.itemsId = itemId
cart.itemWeight =binding.counter.text.toString()
viewModelOwner.viewModelScope.launch {
val result = selectedItemViewModel.setCart(binding.category?.id!!, cart)
Log.d("result", result)
if(result) {
showShortToast("Success")
binding.cartIndicator.visibility = View.VISIBLE
// Start the activity here
} else showShortToast("Failed")
}
}https://stackoverflow.com/questions/61906866
复制相似问题