如何在生命周期Scope.launch 中返回布尔值

Posted

技术标签:

【中文标题】如何在生命周期Scope.launch 中返回布尔值【英文标题】:How to return boolean value in lifecycleScope.launch 【发布时间】:2021-09-13 04:46:18 【问题描述】:

我有一个 corountine,我使用了生命周期Scope.launch,我希望它返回一个布尔值。我该怎么做?

fun updateDb(restaurantEntity: RestaurantEntity, mode: Int): Boolean 
    val db =
        Room.databaseBuilder(requireContext(), RestaurantDatabase::class.java, "restaurant-db")
            .build()

    lifecycleScope.launch  
        when (mode) 
            1 -> 
                val restaurant: RestaurantEntity =
                    db.restaurantDao().getAllRestaurant(restaurantEntity.restaurant_Id)
                db.close()
                return@async true
            

            2 -> 
                db.restaurantDao().insertRestaurant(restaurantEntity)
                db.close()
                true
            

            3 -> 
                db.restaurantDao().deleteRestaurant(restaurantEntity)
                db.close()
                true
            
        
    
    return false

我使用 return@async true 并使用 return true 并且只是 true,它们都不起作用。

【问题讨论】:

您能补充更多信息吗?什么是布局? spinner 和 recyclerview 是不同的东西,所以你想如何同时触发两者。需要更多信息来了解问题。 我添加了几行代码@MohitAjwani 嘿@yazhini,请考虑添加 entier viewHolder 和 onBindViewHolder 代码,并在提问时始终尝试提供简洁和所有相关信息/代码。所以这里的社区可以为您提供更好的帮助。 我上传了整个代码@ParagPawar 还不完整,请贴出整个适配器代码和布局,我们无法知道列表的类型是什么以及视图层次结构如何。 【参考方案1】:

根据您在 cmets 中描述的内容,我认为实现此目的的最佳方法是在您的 OrderViewHolder 中创建一个变量,该变量将存储 finalPrice,以便您可以在您的 Adapter 中使用它。类似的东西:

class OrderViewHolder(
    itemView: View
) : RecyclerView.ViewHolder(itemView) 

    // Init finalPrice
    var finalPrice: Int = 0

    override fun onItemSelected(
        parent: AdapterView<*>?,
        view: View?,
        position: Int,
        id: Long
    ) 

        // calculate finalPrice 
        finalPrice = (currentPrice * quantity!!).toString()
    


然后你可以在你的适配器中访问finalPrice

override fun onBindViewHolder(
    holder: OrderViewHolder, 
    position: Int
) 

    // Access finalPrice like ->
    holder.finalPrice


【讨论】:

当我这样做时,onBindViewHolder() 中的值始终保持为 0 其实每道菜的最终价格都是计算出来的,计算出来之后的总价就是total += holder.finalPrice 该值始终为 0,因为您可能只是直接复制粘贴它而没有应用设置价格所需的计算或初始化。据我了解,您假设有 5 道菜的适配器,根据选择的数量,它的价格会发生变化,并且您有一个根据用户选择显示的总价格?对吗? 是的。这就是我想做的事 该死,我在那个适配器中看到了这么多错误的东西......你为什么要在适配器的代码中添加所有内容?那是大错特错了。我猜那个按钮和你在构造函数中传递的视图是你的活动/片段视图的一部分,而不是 ViewHolder 本身。适配器不应该接触不属于其范围的视图,甚至不应该启动活动。

以上是关于如何在生命周期Scope.launch 中返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章

当它绑定到调用函数中的 const 引用时,它的返回值的生命周期如何扩展到调用函数的范围?

当它被绑定到调用函数中的const引用时,它的返回值的生命周期如何扩展到调用函数的范围?

activity生命周期

react新的生命周期函数getDerivedStateFromProps

如何在返回新接收的值和缓存值之间的所有组合的迭代器时修复生命周期问题?

理解mpvue的生命周期