【问题标题】:Jetpack Compose. Preview is not available喷气背包组成。预览不可用
【发布时间】:2022-06-17 03:13:38
【问题描述】:

有一个带有compose的项目。

项目中有 2 个模块:coreothergamescore 依赖于 othergames)。

我可以在core 模块中成功查看撰写视图的预览(带有@Preview 注释)。但是当我尝试在othergames 中查看预览时,无法显示预览并出现错误:

The following classes could not be instantiated:
- androidx.compose.ui.tooling.ComposeViewAdapter (Open Class, Show Exception, Clear Cache)
Tip: Use View.isInEditMode() in your custom views to skip code or show sample data when shown in the IDE.  If this is an unexpected error you can also try to build the project, then manually refresh the layout.

有详细说明:

java.lang.NoSuchFieldError: view_tree_saved_state_registry_owner
    at androidx.savedstate.ViewTreeSavedStateRegistryOwner.set(ViewTreeSavedStateRegistryOwner.java:53)
    at androidx.compose.ui.tooling.ComposeViewAdapter.init(ComposeViewAdapter.kt:666)
    at androidx.compose.ui.tooling.ComposeViewAdapter.<init>(ComposeViewAdapter.kt:217)
    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:373)
    at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:192)
    at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:150)
    at com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:302)
    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:361)
    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:727)
    at com.android.tools.idea.rendering.RenderTask.lambda$inflate$7(RenderTask.java:883)
    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)

两个模块在build.gradle 文件中具有相同的组合依赖项和设置:

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
        useIR = true
    }
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerExtensionVersion '1.2.0-alpha03'
    }

还有:

dependencies {

...

    implementation "androidx.compose.ui:ui:1.2.0-alpha03"
    implementation "androidx.compose.ui:ui-tooling:1.2.0-alpha03"
    implementation "androidx.compose.ui:ui-tooling-preview:1.2.0-alpha03"
    implementation "androidx.compose.foundation:foundation:1.2.0-alpha03"
    implementation "androidx.compose.foundation:foundation-layout:1.2.0-alpha03"
    implementation "androidx.compose.material:material:1.2.0-alpha03"
    implementation "androidx.compose.material:material-icons-core:1.2.0-alpha03"
    implementation "androidx.compose.material:material-icons-extended:1.2.0-alpha03"
    implementation "androidx.compose.animation:animation:1.2.0-alpha03"
    implementation "androidx.compose.animation:animation-core:1.2.0-alpha03"
    implementation "androidx.compose.animation:animation-graphics:1.2.0-alpha03"
    implementation "androidx.compose.runtime:runtime-livedata:1.2.0-alpha03"
    implementation "androidx.compose.compiler:compiler:1.2.0-alpha03"

...

为什么我在othergames 模块中看不到预览?如何解决?

【问题讨论】:

  • 您使用的是什么版本的 Android Studio?
  • @ThanasisM Android Studio Bumblebee | 2021.1.1 Patch 1 Build #AI-211.7628.21.2111.8139111,于 2022 年 2 月 2 日构建 运行时版本:11.0.11+9-b60-7590822 amd64 VM:Oracle Corporation 的 OpenJDK 64 位服务器 VM Windows 10 10.0 GC: G1 年轻代,G1 老一代内存:1280M 内核:12 注册表:external.system.auto.import.disabled=true 非捆绑插件:org.jetbrains.kotlin (211-1.6.10-release-923-AS7442.40 )
  • @ThanasisM 我也将工作室更新为 Chipmunk 测试版,但没有用。

标签: android android-jetpack-compose


【解决方案1】:

我找到了解决方法。在预览中断的模块中,我添加了我最近删除的库:

implementation 'androidx.appcompat:appcompat:1.4.1'

一旦我这样做了,预览就会再次出现。我不确定这个库是不是真的原因,因为core 模块不包含这个库,但仍然显示预览。

更新:

时间过去了,我又遇到了这个问题。现在不是通过添加我上面提到的库来解决的。我还是不知道该怎么办。

【讨论】:

  • 在我的情况下添加 appcompat 修复了它,谢谢!
【解决方案2】:

之前遇到过确切的问题。确保一切都是最新的,这包括:

Android Studio ( 帮助 > 检查更新) Jetpack Compose(项目级构建) Kotlin(项目级构建)

除此之外,compose-tooling 依赖项的版本应该与 Compose 本身的版本相同。

这就是解决我的问题的方法

@Preview(showSystemUi = true, showBackground = true) // Apparently, adding these two lines seems to do the magic here
@Composable
fun MyComposable(){
     ...
}

嗯,应该差不多了。

看看Studio BumbleBee "Render Problem" For Compose Preview

【讨论】:

    【解决方案3】:
  • 每当您看到“尝试构建项目”错误时,请始终首先检查 gradle 实现。
  • 然后,继续检查您的版本号是否正确。
  • Alpha 版本并不总是最佳选择。
  • 因此,如果您在实现中找不到错误,请将任何与错误相关的实现回滚到之前的稳定版本。
  • 然后再次检查。
  • 另外,也许尝试创建一个新的 android studio 项目并检查新的和您当前的核心实现是否相似,或者至少对于常见的看起来没问题。
  • 如果它们看起来不错,请在所有看起来不错的实现之外添加注释。然后专注于其他实现。

    现在,假设您的错误是相同的,即 try to build the project 的组合并与 compose 相关联,请检查所有基于 ui 的实现,如果您正在使用它们,请检查您的 jetpack 组合实现。希望对您有所帮助。

  • 【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-12
      • 2022-10-20
      • 2021-12-05
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-29
      相关资源
      最近更新 更多