Jetpack Compose - 无虚拟方法集Content

Jetpack Compose - No virtual method setContent

提问人:Tobias Reich 提问时间:11/16/2023 最后编辑:Tobias Reich 更新时间:11/20/2023 访问量:58

问:

我想将 Jetpack Compose 添加到我的 Android 应用程序中。 库已经添加(根据教程和 Google 的示例应用程序)。我使用 Kotlin 1.9.20,编译 JVM 版本是 Java 17。 Activity 是一个 AppCompatActivity(),因此它应该与 compose 兼容。

build.gradle 文件添加了以下行:

compileOptions {
    sourceCompatibility = 17
    targetCompatibility = 17
}

with(kotlinOptions) {
    jvmTarget = "17"
    languageVersion = 1.9
}

buildFeatures {
    compose = true
}
composeOptions {
    kotlinCompilerExtensionVersion = "1.5.4"
}

我们有一个 buildSrc 项目和项目,并且我们在那里声明了依赖项,如下所示:

dependencies {
    implementation("com.android.tools.build:gradle:8.1.2")
    ...
}

这似乎是问题的原因。当我删除此依赖项并在 settings.gradle.kts 中指定它时,它可以工作。

库的最小版本如下所示:

implementation(platform("androidx.compose:compose-bom:2023.10.01"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material:material")
implementation("androidx.compose.ui:ui-tooling-preview")

所以一切看起来都很好。 但是,当我添加 composeView 时,我收到一个异常,如下所示:

NoSuchMethodError:无虚拟方法 setContent(Lkotlin/jvm/functions/Function0;)V级 Landroidx/compose/ui/platform/ComposeView;

对于使用 XML 布局的简化代码,在布局中添加 ComposeView,如下所示:

composeView = view.findViewById(R.id.compose_view)
composeView.setContent {
  ...
}

在第一行中,我已经可以看到我的 XML 布局的 composeView。它是一个 ComposeView。只是下一行失败。

我还尝试将整个片段作为 Compose 的容器。

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return ComposeView(requireContext()).apply {
           setViewCompositionStrategy(
               ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
            setContent {
                // In Compose world
                MaterialTheme {
                    MyLayout()
                }
            }
        }
    }

我仍然收到同样的错误:

java.lang.NoSuchMethodError: No virtual method setContent(Lkotlin/jvm/functions/Function0;)V in class Landroidx/compose/ui/platform/ComposeView; or its super classes
     (declaration of 'androidx.compose.ui.platform.ComposeView' appears in /data/app/~~XE01rsSoScPaH1MnxHjNsA==/.../base.apk)
     at myFragment.onCreateView(MyFragment.kt:30)
     at androidx.fragment.app.Fragment.performCreateView(Fragment.java:3114)
android gradle android-gradle-plugin android-jetpack-compose

评论


答:

0赞 stan372 11/16/2023 #1

我相信你只需要添加这个依赖项:implementation("androidx.activity:activity-compose")

评论

0赞 Tobias Reich 11/16/2023
谢谢你的建议。我试过了,但它仍然不起作用。仍然收到 ComposeView(而不是 Activity)的 setContent 的“NoSuchMethodError: No virtual method setContent”异常!
0赞 psyill 11/30/2023 #2

我遇到了同样的错误。就我而言,我忘了把

buildFeatures {
    compose true
}

composeOptions {
    kotlinCompilerExtensionVersion my_compose_compiler_version
}

在我的build.gradle中。插入这些行使问题消失了。