Jetpack Compose 预览无法再渲染

aga*_*aga 2 android android-studio android-jetpack-compose

从昨天开始我开始遇到一个奇怪的问题。基本上,我的预览都无法渲染,如果我单击预览附近的小信息图标,我会看到以下堆栈跟踪:

Failed to instantiate one or more classes
The following classes could not be instantiated:
     -androidx.compose.ui.tooling.ComposeViewAdapter(Open Class, Show Exception, Clear Cache)

if this is an unexpected error you can also try to build the project, then manually refresh the layout

java.lang.NoClassDefFoundError: Could not initialize class androidx.customview.poolingcontainer.PoolingContainer
    at androidx.compose.ui.platform.ViewCompositionStrategy$DisposeOnDetachedFromWindowIfNotInPoolingContainer.installFor(ViewCompositionStrategy.android.kt:97)
    at androidx.compose.ui.platform.AbstractComposeView.<init>(ComposeView.android.kt:123)
    at androidx.compose.ui.platform.ComposeView.<init>(ComposeView.android.kt:392)
    at androidx.compose.ui.platform.ComposeView.<init>(ComposeView.android.kt:388)
    at androidx.compose.ui.tooling.ComposeViewAdapter.<init>(ComposeViewAdapter.kt:131)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:339)
    at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:176)
    at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:136)
    at com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:301)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:417)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:428)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:332)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:965)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:663)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:505)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:363)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:436)
    at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:121)
    at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:739)
    at com.android.tools.idea.rendering.RenderTask.lambda$inflate$8(RenderTask.java:895)
    at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
Run Code Online (Sandbox Code Playgroud)

现在,我很确定我至少一周没有更改任何构建文件(我检查了 Git 历史记录),所以这不可能是由于某些错误配置的依赖项造成的。我也没有更新Android Studio或任何与SDK相关的工具。

我正在使用 Android Studio Giraffe ( 2022.3.1),Jetpack Compose BOM 设置为'2023.06.01'(正如我之前所说,自昨天以来这些版本均未更改)

清理和重建项目没有帮助;使项目的缓存无效似乎也不起作用。这可能是什么,这个类怎么会从类路径中消失呢?

aga*_*aga 5

事实证明,解决方案是如此简单,以至于我用头撞墙了几分钟。

您不能简单地使用一组运行时库来渲染 Compose Preview;为此,您需要有一个特定的库来提供 IDE 所需的额外代码。这个库通常是这样定义的:

debugImplementation "androidx.compose.ui:ui-tooling"
Run Code Online (Sandbox Code Playgroud)

(版本代码被省略,因为正如我之前所说,我依靠 Jetpack Compose BOM 来定义所有 JC 版本)。

现在,昨天我正在追踪似乎只在发布版本上重现的错误,因此为了做到这一点,我必须切换到发布版本。一旦我这样做了,ui-tooling它就不再适用于 Android Studio,所以,堆栈跟踪中提到的那个类自然就消失了。

要解决该问题,请打开左角的“构建变体”菜单,并确保您的构建变体设置为debug/productionDebug或项目中拥有的任何构建变体。将其设置为具有debug将其设置为名称中

就是这样。