gradle 未解析的引用:下水

eivgtgni  于 2022-11-30  发布在  其他
关注(0)|答案(8)|浏览(185)

尝试为Kotlin协同程序运行一些示例,但无法构建我的项目。我使用的是最新的gradle版本- 4.1
有什么建议要检查/修复吗?
这里是build.gradle

buildscript {
    ext.kotlin_version = '1.1.4-3'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'
apply plugin: 'application'

kotlin {
    repositories {
        jcenter()
    }

    experimental {
        coroutines 'enable'
    }

    dependencies {
        compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.18"
    }
}

main.kt之间的关系

fun main(args: Array<String>) {
    launch (CommonPool) {
        delay(1000L)
        println("World!")
    }

    println("Hello, ")
    Thread.sleep(2000L)
}

当我运行gradle compileKotlin时,我得到以下结果

e: /Users/philippgrigoryev/projects/kotlin-coroutines/src/main/kotlin/main.kt: (2, 5): Unresolved reference: launch
e: /Users/philippgrigoryev/projects/kotlin-coroutines/src/main/kotlin/main.kt: (2, 13): Unresolved reference: CommonPool
e: /Users/philippgrigoryev/projects/kotlin-coroutines/src/main/kotlin/main.kt: (3, 9): Unresolved reference: delay`
mwg9r5ms

mwg9r5ms1#

Launch不再直接使用。Kotlin documentation建议使用:

fun main() { 
    GlobalScope.launch { // launch a new coroutine in background and continue
        delay(1000L)
        println("World!")
    }
    println("Hello,") // main thread continues here immediately
    runBlocking {     // but this expression blocks the main thread
        delay(2000L)  // ... while we delay for 2 seconds to keep JVM alive
    } 
}
arknldoa

arknldoa2#

如果您使用的是Coroutines 1.0+,则导入不再是
导入kotlinx.coroutines.experimental.*
但是,
导入kotlinx.协同程序.启动
在build.gradle的依赖项闭包中,您需要以下内容(对于Coroutines 1.0.1):

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1"
kr98yfug

kr98yfug3#

就像在评论中已经回答的那样,kotlinx.coroutines.experimental.*包缺少导入。如果你喜欢的话,你可以看看我在GitHub的例子。

import kotlinx.coroutines.experimental.*

fun main(args: Array<String>) {

    launch(CommonPool) {
        delay(1000)
        LOG.debug("Hello from coroutine")
    }

}
rbl8hiat

rbl8hiat4#

这让我困惑了一段时间,因为我正在做的教程显示它是直接使用的...我认为他们已经改变了它是如何使用从以前的版本。
我认为诀窍在于您只能在Coroutine作用域中调用launch()。
所以这是行不通的:

fun main() {
    launch()  // not called within coroutine scope
}

适用范围:

fun main() {
 runBlocking {
        launch()  // called within coroutine scope
    }
}

code snippit example

gwo2fgha

gwo2fgha5#

试着这样,
//将此行添加到gradle

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$rootProject.kotlinx_coroutines"
 implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$rootProject.kotlinx_coroutines"

  class xyz{
     private val job = Job()
        private val coroutinesScope: CoroutineScope = CoroutineScope(job + Dispatchers.IO)

      ....
     . ...
       coroutinesScope.launch {
                       // task to do
                        Timber.d("Delete Firebase Instance ID")
                    }

    // clear the job
      job.cancel()

    }
lztngnrs

lztngnrs6#

我正在使用

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1"

GlobalScope.launch代替launch工作。
以下是进口:

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
2fjabf4q

2fjabf4q7#

我在使用kotlinx-corontine-core库时遇到了这个问题,下面是我的gradle,

buildscript {
    ext.kotlin_version = '1.5.21'
    ext.kotlin_coroutines_version = '1.3.9'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:3.6.0"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.20'
    }
}

// .....

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar", '*.aar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0'
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
}

那么launch和许多其他来自Kotlin协程的引用就找不到了。下面是我解决这个问题的过程,
首先,在Android Studio下找到最终的依赖项。我很惊讶地发现最终的Kotlin协程库是1.5.0,它应该是空的!

1.3.9也包括在内,但1.5.0更大。因此,最终将使用1.5.0。
然后我尝试通过以下命令找出项目依赖项,

>gradlew :app:dependencies

其中“aap”是项目模块名称。
然后我发现它的lifecycle-viewmodel-ktx使用它。
所以,我试着把这个库升级到一个更高的版本,1.6.0。然后,我发现它现在不是空的,每个引用都能正常工作。
所以,要解决这个问题,你需要,
1.查找您在项目中使用的Kotlin协程核心库的版本
1.调查库中发生了什么,它是1.5.0还是空?
1.查找此版本的引入者
1.尝试升级到更新版本

nfzehxib

nfzehxib8#

试试这个

CoroutineScope(coroutineContext).launch { 
        
    }

相关问题