更新列项中的计数值Android Jetpack Compose

uqxowvwt  于 10个月前  发布在  Android
关注(0)|答案(1)|浏览(101)

产品项目组成:

@Composable
fun ProductItem(product: Product, index: Int) {

    val addProductViewModel = hiltViewModel<AddProductVM>()

    val productSelectedIndex = remember { mutableIntStateOf(0) }

    Card(
        modifier = Modifier
            .fillMaxWidth()
    ) {
        Row(modifier = Modifier
            .fillMaxHeight()) {

            Column() {

                Row{
                    Box(
                        modifier = Modifier
                            .weight(1f)
                        contentAlignment = Alignment.Center
                    ) {
                        if (product.variants[0].cart_count > 0) {
                            Row {
                                Text(text = product.variants[0].cart_count.toString())
                      }
                        } else {
                            Text(
                                text = "Add To Cart", // "Add To Cart" text
                                modifier = Modifier
                                    .clickable {
                                        productSelectedIndex.intValue = index
                                        val newCount = product.variants[0].cart_count + 1
                                        addProductViewModel.addProduct(product.variants[0].product_id.toString(),
                                            newCount.toString(),
                                            product.variants[0].id.toString())
                                    }
                            )
                        }
                    }
                }
            }
        }
    }
}

字符串
在这里,我想通过单击“添加到购物车文本”来更新文本计数值
AddProductResult可组合:

@Composable
fun AddProductResult(addProductResult: ApiResult<AddProduct>) {

    when (addProductResult) {
        is ApiResult.Loading -> {
            // Loading state code for products
        }

        is ApiResult.Error -> {
            Log.e("addproductapicall", "failure error: " + addProductResult.error.toString())
        }

        is ApiResult.Success -> {
            val Result = addProductResult.data?.error
            if(Result == true) {
                Log.e("addproductapicall", "success success: " + addProductResult.data.message.toString())
            } else {
                Log.e("addproductapicall", "failure success: " + addProductResult.data?.message.toString())
            }
        }
    }
}


当Result == false时,只有在从AddProductResult获得响应后,我才想更新单击“添加到购物车”文本时单击的产品计数文本的UI
现在.它的更新之前API调用结果
这是我的视图模型
AddProductVM:

@HiltViewModel
class AddProductVM @Inject constructor(private val apiService: ApiService,
                                       private val defaultDispatcher: CoroutineDispatcher
): ViewModel() {

    private val _addProductList= MutableStateFlow<ApiResult<AddProduct>>(ApiResult.Empty())
    val addProductList= _addProductList.asStateFlow()

    fun addProduct(productId:String,qty:String,productVariantId:String){
        _addProductList.value = ApiResult.Loading()
        viewModelScope.launch {
            apiService.addProduct(productId,qty,productVariantId)
                .flowOn(defaultDispatcher)
                .catch {
                    _addProductList.value= ApiResult.Error(it.message ?: "Something went wrong")
                }
                .collect{
                    _addProductList.value=it
                }
        }
    }
}

4ioopgfo

4ioopgfo1#

首先,你的ApiResult类应该是这样的。你应该分别检查成功和错误状态。你不需要在ApiResult.Success中再次检查错误。

sealed class ApiResult<out T> {
    object Loading: ApiResult<Nothing>()

    data class Success<out T>(
        val data: T
    ): ApiResult<T>()

    data class Error(
        val e: Exception
    ): ApiResult<Nothing>()
}

字符串
收集应该是这样的

viewModelScope.launch {
    apiService.addProduct(productId,qty,productVariantId)
        .flowOn(defaultDispatcher)
        .catch {
            _addProductList.value= ApiResult.Error(e = it)
        }
        .collect{
            _addProductList.value= ApiResult.Success(data = it)
        }
}


奋力谱写

when (addProductResult) {
    is ApiResult.Loading -> {
        // Loading state code for products
    }

    is ApiResult.Error -> {
        Log.e("addproductapicall", "failure error: " + addProductResult.e.message)
    }

    is ApiResult.Success -> {
        val Result = addProductResult.data
    }
}


如果你用这种方法,它应该工作得很好。你将不得不工作一点,我不能看到整个代码。这应该是正确的方法。

相关问题