【问题标题】:Using StateFlow in an Android Project在 Android 项目中使用 StateFlow
【发布时间】:2020-06-15 11:34:16
【问题描述】:

必须是一个非常简单的解决方案,但是... 我在我的 android 项目中使用 StateFlow 来替换在服务中用作 Observables 的 LiveData。我使用 LiveData 作为Room Database 的可观察对象,但是关于线程的限制(必须在主线程上注册观察者并通知)使我切换到Flow 类。一切都非常合乎逻辑,并且为了保留有关状态的信息,然后我决定使用StateFlow

我加了

实现“org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7”

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions.freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
}

在我的 gradle 文件中和

@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)

在具有 StateFlow 成员类型的类之上。 但是当我运行项目时出现崩溃:

java.lang.NoClassDefFoundError:解析失败: Lkotlinx/coroutines/flow/StateFlowKt; …… 引起:java.lang.ClassNotFoundException:在路径上找不到类“kotlinx.coroutines.flow.StateFlowKt”:DexPathList [[zip文件“/data/app/com.xxxxx.consumer-X46raHzqXUeRRH40JT1LUg==/base.apk "],nativeLibraryDirectories=[/data/app/com.xxxxx.consumer-X46raHzqXUeRRH40JT1LUg==/lib/arm64, /data/app/com.xxxxx.consumer-X46raHzqXUeRRH40JT1LUg==/base.apk!/lib/arm64-v8a , /system/lib64, /system/product/lib64]] ....

在使用 Kotlin 的 Android 项目中添加 StateFlow 需要哪些步骤?

谢谢!

【问题讨论】:

  • 我刚刚使用了org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6,没有您的其余更改。你在使用多个模块吗?而且,如果是这样,您是否可能将implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7" 放入库模块中?如果是这样,也许应该是api,或者应用程序模块也应该有implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7"
  • 是的,你是对的,我有一个库,我将它编译为 aar,然后在 gradle(和 releaseImplementation 文件)上使用 debugImplementation files 将其包含在项目中。尝试在 app 模块中添加 ..coroutine-core... 并成功了!谢谢! (如果你把你的评论写成我会接受的)

标签: android kotlin kotlin-coroutines


【解决方案1】:

您有多个模块,而您使用 StateFlow 的库模块显然不是通过工件存储库分发的。结果,使用该模块的应用程序模块没有获得传递依赖数据,因此它无法知道您的库模块需要特定版本的协程。

恕我直言,理想情况下,您将使用工件存储库(例如,mavenLocal())并让库模块对协程库使用 api 依赖项。

如果您不想搞砸,任何使用该库的模块也应该具有协程依赖项,并具有匹配(或至少兼容)的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2016-08-31
    • 2014-09-19
    • 2015-02-04
    相关资源
    最近更新 更多