Android Jetpack编写- java.lang.无此类方法错误:没有虚拟方法setContent(Lkotlin/jvm/functions/Function 0;)

snvhrwxg  于 2022-11-03  发布在  Android
关注(0)|答案(7)|浏览(217)

我在尝试运行setContent{ Composable() }时遇到java.lang.NoSuchMethodError异常。
完整代码:

class ComposeFragment : Fragment() {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) =
        ComposeView(requireContext()).apply { setContent { Text("hello") } }

}

完整异常:

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/~~3OmVKUoYitZ_S4H81xmyuw==/my.app.package-PAQxAKmtRuhnzp4M2DME8w==/base.apk)

类似问题的解决方案/答案建议添加buildFeatures { compose = true }kotlinCompilerExtensionVersion,我已经这样做了,但问题仍然存在。
我的完整compose Gradle配置如下所示:

kotlinOptions {
    jvmTarget = JavaVersion.VERSION_1_8.toString()
    useIR = true
}

buildFeatures {
    compose = true
}

composeOptions{
    kotlinCompilerExtensionVersion = "1.0.5"
}

implementation( "androidx.activity:activity-compose:1.3.1" )
implementation( "androidx.activity:activity-compose:1.3.1" )
implementation( "androidx.compose.material:material:1.0.5" )
implementation( "androidx.compose.animation:animation:1.0.5" )
implementation( "androidx.compose.ui:ui-tooling:1.0.5" )
implementation( "androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07" )
androidTestImplementation( "androidx.compose.ui:ui-test-junit4:1.0.5" )
vh0rcniy

vh0rcniy1#

今天遇到了同样的异常,所以我把我的解决方案放在这里,以防其他人需要它。
在我的例子中,这是因为android部分的build.gradle文件中缺少下面的设置

buildFeatures.compose = true
    composeOptions {
        kotlinCompilerExtensionVersion = Versions.COMPOSE
    }

Version.COMPOSE是合成版本,在我的例子中是1.1.0-alpha05

but5z9lq

but5z9lq2#

我遇到了同样的问题,通过在我的应用的build.gradle文件中添加以下行,问题得到了解决:

android {
   buildFeatures {
       compose true
   }
}
acruukt9

acruukt93#

您的Compose版本太旧,几乎可以肯定这就是您出现问题的原因。请使用以下内容更新您的项目Gradle。请确保同时升级插件版本:

buildscript {
    ext {
        compose_version = '1.1.0-rc01'
    }
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.1.0'
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0'
    }
}

请确保所有依赖项都使用最新的稳定版本。
您还应该更新您的Kotlin插件版本:
211-1.6.10-release-923-AS7442.40
如果您不知道在哪里设置,请单击:
Android Studio > Preferences > Languages & Frameworks > Kotlin
最后,我强烈建议您使用Java 11而不是Java 8,并将应用的build.gradle设置为:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

apply from: 'codeinc.gradle'

android {
    compileSdkVersion 31
    buildToolsVersion "31.0.0"

    defaultConfig {
        applicationId "mydomain.myapp.blablahblah"
        minSdkVersion 21
        targetSdkVersion 31
        versionName "1.0.0"

        versionCode 1
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = '11'
        useIR = true
    }
    buildFeatures {
        compose true
    }
    composeOptions {
        kotlinCompilerExtensionVersion compose_version
        kotlinCompilerVersion '1.6.0'
    }
}
zbwhf8kr

zbwhf8kr4#

添加到build.gradle.kts

android {
    buildFeatures {
        compose = true
    }

    composeOptions {
        kotlinCompilerVersion = Depends.kotlin
        kotlinCompilerExtensionVersion = Depends.compose
    }
}
pw9qyyiw

pw9qyyiw5#

将以下行添加到模块的gradle文件中:

buildFeatures {
    compose = true
}
composeOptions {
    kotlinCompilerExtensionVersion = rootProject.extra["compose_version"] as String
}

如果您在多模块项目中工作,则必须为每个组成所包含模块添加此内容

mzaanser

mzaanser6#

@Composable
private fun Greeting() {
    Text(
        text = stringResource(R.string.channel_id),
        style = MaterialTheme.typography.h5,
        modifier = Modifier
            .fillMaxWidth()
            .padding(horizontal = 10.dp)
            .wrapContentWidth(Alignment.CenterHorizontally)
    )
}

class ShowAvatarImageActivity : AppCompatActivity() {
    ......
    val greeting = findViewById<ComposeView>(R.id.greeting)
    greeting.setContent {
        Greeting()
    }
    ......
}

Gradle配置,例如您
我的xml文件像这样

<androidx.constraintlayout.widget.ConstraintLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_gravity="center"
  android:background="#000">

    ......

  <androidx.compose.ui.platform.ComposeView
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    android:id="@+id/greeting"
    android:layout_width="match_parent"
    android:layout_height="200dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

我使用纯Kotlin代码对单独的函数进行比较测试

hgb9j2n6

hgb9j2n67#

要集成composeView,您必须在下面添加依赖项;实现'androidx.活动:活动-编写:1.4.0'
另外,不要忘记支持Kotlin的compose版本。
如果您使用的是compose版本1.1.1,则必须使用Kotlin版本

相关问题