LiveEdit 在 Android Studio 中无法工作:内部错误 ClassCastException BasicValue 无法转换为 IntValue

问题描述 投票:0回答:1

我在项目中使用 jetpack compose。

我正在使用 android studio Koala 2024.1.2 Patch 1。我使用的所有内容几乎都是最新版本。

我有一个简单的可组合屏幕(一堆互相使用的可组合函数)。我在此屏幕中使用的唯一特殊之处是,我通过动态创建一些可组合项来使用 PagingData,并且我还使用注入 Hilt 的视图模型。

由于使用了 ViewModel,我一直在努力使预览工作,但我已经通过创建使用视图模型中的流的“内容”可组合项来解决问题,但它们不访问视图模型本身。

@Composable
fun SlideMovieScreen(viewModel: SlideMovieViewModel = hiltViewModel()) {
    val deviceLanguage = getDeviceLocale()
    viewModel.setLanguage(deviceLanguage)
    val context = LocalContext.current
    val vibrator = remember { getVibrator(context) }

    SlideMovieScreenContent(viewModel.swipeAction, viewModel.moviesFlow, {
        triggerSmallVibration(vibrator); viewModel.onLikeButtonClicked()
    }, {
        triggerSmallVibration(vibrator); viewModel.onDislikeButtonClicked()
    }, {
        viewModel.clearSwipeAction()
    })
}


@Preview
@Composable
fun SlideMovieScreenPreview() {
    val swipeAction =
        remember { MutableStateFlow(SlideMovieViewModel.SwipeAction.LIKE).asStateFlow() }
    val moviesFlow =
        flowOf(PagingData.from(movies))
    FilmatchApp {
        SlideMovieScreenContent(swipeAction, moviesFlow, {}, {}, {})
    }
}

除了在预览中遇到困难(我认为在 jetpack 中使用 ViewModel 时这是正常的)之外,我的主要问题是 LiveEdit 根本无法工作。当我运行应用程序并进行细微更改(例如更改任何颜色)时,我只会看到此错误:

Internal error Unexpected error during compilation command java.lang.ClassCastException class.org.objectweb.asm.tree.analysis.BasicValue cannot be cast to class com.android.tools.idea.run.deployment.liveedit.analysis.IntValue

抱歉,我无法复制完整的错误文本,因为当我尝试将鼠标光标移动到文本时,它消失了。

Error message

android android-jetpack-compose preview liveedit
1个回答
0
投票

您的问题很难复制,因为我们不知道您的

SlideMovieScreenContent
可组合项内部有什么。不过,您可以尝试增量调试方法来查找原因。

我刚刚创建了您的代码的最小示例:

@Preview
@Composable
fun SlideMovieScreenPreview() {

    val swipeAction =
        remember { MutableStateFlow("HELLO").asStateFlow() }
    val moviesFlow =
        flowOf("WORLD!")
    
    FilmatchApp {
        SlideMovieScreenContent(swipeAction, moviesFlow, {}, {}, {})
    }
}

@Composable
fun SlideMovieScreenContent(swipeAction: StateFlow<String>, moviesFlow: Flow<String>, function: () -> Unit, function1: () -> Unit, function2: () -> Unit) {
    Text(text = "${swipeAction.value} ${moviesFlow.collectAsState("").value}")
}

使用此代码,LiveEdit 可以正常工作。每当我更改

HELLO
WORLD
时,它都会在模拟器上正确刷新。

请尝试将此代码粘贴到您的一端,看看它是否也适合您。

  • 如果最小示例有效,请开始逐步将其迁移到以前的代码,并查看 LiveEdit 在什么时候停止工作。那么您就找到了问题并可以进一步调查。
  • 如果最小示例不起作用,请转到您的
    build.gradle
    文件并检查是否有一些可用的更新依赖项。如果有,请更新所有版本以使用最新版本。
  • 如果仍然不行,您还可以检查是否有任何可用的Android Studio更新。
© www.soinside.com 2019 - 2024. All rights reserved.