使用 Kotlin Coroutines 依赖问题构建的集成库模块

Integrate Library module built with Kotlin Coroutines dependency issue

我正在构建一个使用协程的库模块。

我的图书馆执行以下操作:

  1. 从应用程序模块获取配置
  2. 创建一个实现了 CoroutineScope (ContentListingFragment) 的片段
  3. ContentListingFragment 处理所有从网络获取数据的过程并显示它们

来自应用程序模块: 我们应该能够从 ContentListingFragment 中获取一个实例并将其添加到容器中

问题:当我构建应用程序时,出现以下错误:

Supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
    class nabed.apps.nabedutilslibrary.ui.base.ContentListingFragment, unresolved supertypes: kotlinx.coroutines.CoroutineScope 

下面是库模块build.gradle

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: "kotlin-kapt"
apply plugin: 'androidx.navigation.safeargs'

android {
    compileSdkVersion 28
    buildToolsVersion "29.0.0"


    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles 'consumer-rules.pro'
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
        kotlinOptions {
            jvmTarget = "1.8"
        }
    }
}

androidExtensions{
    experimental = true
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'

    // Navigation
    implementation "android.arch.navigation:navigation-fragment:$navigation_version"
    implementation "android.arch.navigation:navigation-ui:$navigation_version"
    implementation "android.arch.navigation:navigation-fragment-ktx:$navigation_version"
    implementation "android.arch.navigation:navigation-ui-ktx:$navigation_version"


    //Kotlin Coroutines
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0-RC1"


    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

如何在不更改应用程序模块的情况下处理此问题?

您必须更改库的 build.gradle:

中的依赖项声明
//Kotlin Coroutines
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0-RC1"

api 关键字会将这些依赖项暴露给应用程序模块

****将此代码放入 build.gradel 文件中的依赖项块中,然后单击同步 ****

//Kotlin 协程

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0"

如果您不打算在应用程序模块中使用协同程序,但想在库中使用它,那么决定 api 依赖项不是最好的。通过这种方式,您的应用程序模块也将依赖于协程。

我认为,最好从 ContentListingFragment 中删除 CoroutineScope 实现并创建 CoroutineScope 对象作为 ContentListingFragment 成员。

class ContentListingFragment : Fragment() {

    private val job = Job()
    private val coroutineScope = object : CoroutineScope {
        override val coroutineContext: CoroutineContext
            get() = job + Dispatchers.IO

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        coroutineScope.launch { ... }
    }

    override fun onDestroyView() {
        super.onDestroy()
        job.cancelChildren()
    }
}

此外,LifecycleScope 形式 lifecycle-runtime-ktx 可能是最简单的解决方案。它将删除 CoroutineScope 创建样板代码。

class ContentListingFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycleScope.launch { ... }
    }
}