我在项目中使用 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
抱歉,我无法复制完整的错误文本,因为当我尝试将鼠标光标移动到文本时,它消失了。
您的问题很难复制,因为我们不知道您的
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
时,它都会在模拟器上正确刷新。
请尝试将此代码粘贴到您的一端,看看它是否也适合您。
build.gradle
文件并检查是否有一些可用的更新依赖项。如果有,请更新所有版本以使用最新版本。