【问题标题】:Jetpack Compose Kotlin saysJetpack Compose Kotlin 说
【发布时间】:2021-07-28 10:48:35
【问题描述】:

我将 lambda 传递给可组合对象以在 Modifier.clickable 上触发,但编译器警告“表达式未使用”

为什么会发生这种情况以及如何纠正它?很奇怪?

Screenshot of compiler warning


@Composable
fun MainScreen(dateVM: DateViewModel = DateViewModel(), dateList: List<DateList>) {

    val dayIndexState = remember {
        mutableStateOf(0)
    }

    Column {
        ShowDateScroll(dateIndex = dayIndexState.value) {
            newDateIndex -> dayIndexState.value = newDateIndex
        }
    }
}

@Composable
fun ShowDateScroll(
    dateIndex: Int,
    dateIndexUpdate: (newIndexState: Int) -> Unit
) {
    LazyRow(
        modifier = Modifier
            .fillMaxWidth()
            .background(Color.LightGray),
        horizontalArrangement = Arrangement.spacedBy(25.dp)
    ) {
        items(items = dateList, itemContent = { dateItem ->
            Column(
                horizontalAlignment = Alignment.CenterHorizontally,
                modifier = Modifier
                    .clickable(
                        role = Role.Button
                    ) {
                        dateIndexUpdate
                    }
            ) {
                Text(
                    text = dateItem.dow
                )
                Text(
                    text = dateItem.day.toString(),
                )
            }
        })
    }
}

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    您在尾随 lambda 中传递的代码将永远不会执行。

    尾随的 lambda 本身就是一个函数,如果你只是写下另一个函数名,什么都不会发生。 比较:

    fun function() {}
    fun other() {
      function
    }
    

    如果您从不使用该函数/调用它。因此它没有被使用。

    为了调用代码,您有不同的选择: 用函数引用替换尾随 lambda

    Modifier.clickable(
      role = Role.Button,
      onClick = dateIndexUpdate,
    )
    

    另一种方法是调用函数:

    Modifier.clickable(
      role = Role.Button,
    ) {
      dateIndexUpdate()
      /* or */
      dateIndexUpdate.invoke()
    }
    

    在您的代码中,第二个选项可以与 clickable 一起使用,因为您需要提供参数:

    Modifier.clickable(
      role = Role.Button,
    ) {
      dateIndexUpdate(dateIndex)
      /* or */
      dateIndexUpdate.invoke(dateIndex)
    }
    

    不确定它是否是正确的索引,您需要针对您的代码进行调整。

    【讨论】:

    • 谢谢 - 我觉得自己像个真正的白痴一样没有发现 - 谢谢你的帮助!!
    【解决方案2】:

    因为你只是引用了方法。您必须调用它才能使用它。喜欢dateIndexUpdate(...)。在参数中添加新的索引状态,或者您的用例是什么

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 2022-01-22
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 2021-10-15
      • 2021-08-02
      • 2021-08-20
      相关资源
      最近更新 更多