为什么我不能在“BoxScope”中使用“AnimatedVisibility”?

Luk*_*uke 8 android android-jetpack-compose

我有一个看起来像这样的布局:

Row {
        ...

        Box(
            modifier = Modifier
                .fillMaxHeight()
                .width(50.dp)
        ) {
            AnimatedVisibility(
                visible = isSelected && selectedAnimationFinished,
                enter = fadeIn(),
                exit = fadeOut()
            ) {
                ...
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但我收到编译时错误:

fun RowScope.AnimatedVisibility(visible: Boolean, modifier: Modifier = ..., enter: EnterTransition = ..., exit: ExitTransition = ..., content: AnimatedVisibilityScope.() -> Unit): Unit' can't be called in this context by implicit receiver. Use the explicit one if necessary
Run Code Online (Sandbox Code Playgroud)

看起来 Kotlin 发现AnimatedVisibility函数不明确,因为 Compose 公开了多个AnimatedVisibility具有相同签名的函数:有一个fun AnimatedVisibility没有接收器,一个fun RowScope.AnimatedVisibility需要RowScope.

据我所知,Kotlin 抱怨我使用的RowScope版本不正确,但我只想使用没有接收器的版本!

使用this.AnimatedVisibility也无济于事。

我发现唯一有效的解决方法是完全限定名称,例如androidx.compose.animation.AnimatedVisibility(...). 但我不知道为什么会这样。

任何人都可以对此有所了解吗?有没有比完全限定名称更好的选择?

Ale*_*kov 47

一种解决方法是使用完全限定名称:

Box {
    androidx.compose.animation.AnimatedVisibility(visibile = ...) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我的问题是“除了完全限定名称之外,还有更好的选择吗?” (3认同)

Jef*_*set 24

看起来这是语言中的一个错误 - 重载解析不知道@DslMarkers 之类的东西。我在 Kotlin bugtracker 上找不到相关问题,因此我自己提交了一个 - https://youtrack.jetbrains.com/issue/KT-48215

  • 这绝对是疯狂的,非常感谢您提供的信息和打开错误问题! (3认同)

Dim*_*des 7

除了 Alex 提到的解决方法之外,其他解决方法是当您将 Box 放在列中时引用列范围:

this@Column.AnimatedVisibility(visible = condition) {
    Composable()
}
Run Code Online (Sandbox Code Playgroud)